2013-06-28 34 views
0

我有这个SQL代码插入到名为daily的数据库中。我会定期更新的数据库daily像这样:插入mysql时的重要冲突

INSERT INTO daily 
(SELECT * FROM dailytemp 
WHERE trim(`Point`) <>'' 
AND trim(`Point`) IN (Select trim(`Point`) FROM `data`)); 

我相信我得到的错误,因为两个表具有ID主列。

我想要插入的数据,但一个新的ID生成的任何重复发现。

我试图列出列的名称,但它是大约20列,这可能会导致过程繁琐。

我最好的选择是什么?

编辑的日常

表认定中和daily_temp都是一样的,所有的folumns是VARCHAR(100)和(BIGINT)

id bigint 
col1 varchar(100) 
col2 varchar(100) 
col3 varchar(100) 
etc.. 
+0

“错误”。如果你发布了你正在得到的确切的错误,这将有所帮助。 – Tomdarkness

+0

请张贴表定义为'daily'和'dailytemp' – peterm

+0

我做了更新,请 – Smith

回答

1

一个可能的解决方案可能是使用BEFORE INSERT触发器和一个单独的表进行排序(如果您不介意)。

序列表

CREATE TABLE daily_seq(id BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY); 

现在触发

DELIMITER $$ 
CREATE TRIGGER tg_daily_insert 
BEFORE INSERT ON daily 
FOR EACH ROW 
BEGIN 
    INSERT INTO daily_seq VALUES(NULL); 
    SET NEW.id = LAST_INSERT_ID(); 
END$$ 
DELIMITER ; 

现在你可以插入任何你想每天,id值将与独特的自动替换加一。

这里是SQLFiddle演示

1

事实上的ID,你肯定是想插入已存在于daily中的id行。

如果这不会造成任何引用完整性问题,你可以重新在dailytempid的,使他们不与任何daily一个重叠。这可能会诀窍:

SET @offset = (SELECT MAX(id) FROM daily) - (SELECT MIN(id) FROM dalytemp) +1; 
UPDATE dailytemp SET id = id + @offset; 

然后尝试您的INSERT

如果行可以通过比你所描述的,或者如果由于某种原因id在此表中被跳过(例如,如果该列是AUTO_INCREMENT),则问题会再次出现的一个另一种方法被插入到daily。您可能希望在日常程序中包含此初步UPDATE

0

我决定使用存储proceedure要执行的操作,列出所有colums命名这个头痛的,而不是

感谢所有那些谁帮助。另一个原因,我这样做,是我需要插入的日常表中的每个组插入数据的日期,所以我创建了一个日期列里折射表只

INSERT INTO daily (col1, col2, etc..., created) 
SELECT col1, col2, etc..., 'mydate' from daily_temp WHERE 
trim(`Point`) <>'' AND trim(`Point`) IN 
(Select trim(`Point`) FROM `data`)); 

感谢所有