将数据从一个表插入到另一个表,同时忽略重复的键

时间:2013-06-18 05:06:58

标签: php mysql on-duplicate-key

我有两个MySQL表。第一个表有一个运行的cron作业,每五分钟更新一次。当cron作业运行时,它将所有数据从第一个表移动到第二个表(存档表),截断第一个表,然后从CSV文件中更新信息,该文件在某个URL处不断更新。我通过将结构从一个表复制到下一个表来制作表(因此它们的结构相同)。

这是我正在运行的代码,它起作用:

$sql = "
INSERT INTO table2 (id, time, size, location, county, state, lat, lon, comments)
SELECT id, time, size, location, county, state, lat, lon, comments FROM table1";
$result = $mysqli->query($sql);

问题是,cron作业经常运行,并不总是会完全更新,因此它会在表2中重复输入。这是我试图使用的代码,但它似乎没有起作用:

$sql = "
INSERT INTO table2 (id, time, size, location, county, state, lat, lon, comments)
SELECT id, time, size, location, county, state, lat, lon, comments FROM table1
ON DUPLICATE KEY UPDATE id=id
";
$result = $mysqli->query($sql);

我确保两个表的键都相同(id)。

这些操作不能一起工作,还是我的语法错误?我想尝试一次性运行这些操作,而不是更新表,然后运行一个不同的操作,以便在之后删除重复项。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您可以使用insert ignore query来避免数据重复。但每次选择最大条目时。有时可能会从table1中截断新条目

$sql = "
INSERT IGNORE INTO table2 (id, time, size, location, county, state, lat, lon, comments)
SELECT id, time, size, location, county, state, lat, lon, comments FROM table1";

您可以遵循这种方法     $ primary_id = last_updated_primary_key;

//add where condition int the where query
$sql = "
INSERT INTO table2 (id, time, size, location, county, state, lat, lon, comments)
SELECT id, time, size, location, county, state, lat, lon, comments FROM table1 WHERE id> < last_updated_primary_key >";

使用主现有密钥删除旧条目

DELETE FROM table1 WHERE id < last_updated_primary_key;

覆盖最新的主键

$primary_id = last_updated_new_primary_key;

您可以使用触发器将新条目从一个表动态更新到另一个表

http://dev.mysql.com/doc/refman/5.0/en/triggers.html