比如说:
我有两张桌子: old_data 和 new_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_data 。的 this_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命令。
答案 0 :(得分:3)
假设您的日期被编入索引为唯一键:
INSERT INTO newtable
SELECT *
FROM oldtable
ON DUPLICATE KEY column1=oldcolumn1, ...
答案 1 :(得分:0)
你想要INSERT ... ON DUPLICATE KEY UPDATE。您的解决方案已经满足您的任务的第1步和第3步,ON DUPLICATE KEY UPDATE将负责第2步。
答案 2 :(得分:0)
仅仅执行UPDATE
和INSERT
怎么样?
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)
除非我误解了......
答案 3 :(得分:0)
如果您要先删除该行,而不是更新:REPLACE
它也只是一行,所以:REPLACE数据SELECT,您不必通过添加文本列来做奇怪的事情。