3

比如说:

  • 我有两个表:old_datanew_data

  • old_data和new_data都有一个名为this_is_col的

  • old_data和new_data都有各种(数百)行日期(2010-02-06、2010-01-09、2007-06-02 等)。两个表不一定具有相同的日期,但它们都具有相同的格式。

  • 两个表的字段都是各种整数。


我的任务:

  • 将字段从old_data复制到new_data

  • 如果两个表中都存在日期,则new_data中的字段将被替换。

  • 如果new_data中不存在日期,则将添加正确的行并复制该字段。


这是我已经走了多远:

创建一个临时列:

ALTER TABLE `new_data` ADD `tempColumn` TEXT NULL;

old_data复制数据:

INSERT INTO `new_data` (`tempColumn`) SELECT `this_is_col` FROM `old_data`;

结合临时列和new_datathis_is_col。(我还没有真正想出这一步,因为我还没有走到这一步)。

MERGE? `tempColumn` `this_is_col`;

删除临时表

ALTER TABLE `new_data` DROP `tempColumn`;

在执行第二个操作(将数据传输到临时列)时,我收到此错误:

#1062 - Duplicate entry '0000-00-00' for key 1

现在我被困住了。任何帮助,将不胜感激。我正在使用 MySQL 和 phpMyAdmin 来测试 SQL 命令。

4

4 回答 4

3

假设您的日期被索引为唯一键:

INSERT INTO newtable
SELECT *
FROM oldtable
ON DUPLICATE KEY column1=oldcolumn1, ...
于 2010-07-19T21:29:30.397 回答
0

你想要INSERT ... ON DUPLICATE KEY UPDATE。您的解决方案已经满足您任务的第 1 步和第 3 步,ON DUPLICATE KEY UPDATE 将处理第 2 步。

于 2010-07-19T21:24:47.023 回答
0

只做一个UPDATEandINSERT怎么样?

UPDATE new_data SET col=col 
FROM new_data a join old_data b on a.this_is_col = b.this_is_col

然后

INSERT INTO new_data (cols) SELECT cols 
FROM old_data WHERE this_is_col NOT IN (SELECT this_is_col FROM new_data)

除非我误会了...

于 2010-07-19T21:27:50.990 回答
0

如果您宁愿先删除该行,而不是更新: REPLACE

它也只是一行,所以:REPLACE data SELECT,你不必通过添加文本列来做奇怪的事情。

于 2010-07-19T21:30:18.943 回答