我有两个MySQL表。第一个表运行着一个cron作业,每5分钟更新一次。当cron作业运行时,它将所有数据从第一个表移至第二个表(存档表),截断第一个表,然后从CSV文件更新信息,而该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

07-28 02:43
查看更多