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


INSERT data from one table to another while ignoring duplicate keys

我有两个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)。

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

谢谢你的帮助!

可以使用插入忽略查询来避免数据重复。但是每次你选择的都是最大值。有时可能会截断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