0

我有两个 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 作业运行如此频繁,以至于它并不总是会完全更新,因此它会在 table2 中生成重复条目。这是我试图使用的代码,但它似乎不起作用:

$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)。

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

谢谢你的帮助!

4

1 回答 1

0

您可以使用插入忽略查询来避免数据重复。但是每次您选择最大条目时。有时可能会从 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

于 2013-06-18T05:53:05.363 回答