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