0

我有这个 SQL 代码,它插入一个名为daily. 我定期更新daily数据库是这样的:

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

我相信我收到了错误,因为两个表都有 id 主列。

我想要插入数据,但为找到的任何重复项生成一个新 id。

我试图列出列名,但它大约有 20 列,这可能会使过程变得繁琐。

我最好的选择是什么?

编辑

daily和daily_temp的表定义相同,所有的folumns都是varchar(100),id为(bigint)

id bigint
col1 varchar(100)
col2 varchar(100)
col3 varchar(100)
etc..
4

3 回答 3

1

实际上,您肯定是在尝试插入一行,id其中daily.

如果这不会造成任何参照完整性问题,您可以重新生成id's indailytemp以便它们不会与 .in 文件中的任何一个重叠daily。这可能会奏效:

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

然后试试你的INSERT.

daily如果行可以由您描述的进程之外的另一个进程插入,或者由于任何原因 aid在此表中被跳过(例如,如果列是AUTO_INCREMENT),那么问题将再次发生。您可能希望将此初步UPDATE纳入您的日常程序中。

于 2013-06-28T23:11:33.670 回答
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演示

于 2013-06-28T23:51:50.243 回答
0

我决定使用存储过程来执行操作,列出所有列名称而不是这个头痛

感谢所有帮助过的人。我这样做的另一个原因是我需要为插入的每组数据插入每日表的日期,所以我只为每日表创建了一个日期列

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`));

谢谢大家

于 2013-06-29T00:45:39.170 回答