MySQL INSERT IGNORE / ON DUPLICATE KEY UPDATE不检测重复项

时间:2012-10-13 19:12:42

标签: mysql duplicates ignore

我在这里遇到了一个问题,经过两个小时的谷歌搜索后,Stackoverflow回答并测试了不同的想法,我无法弄明白。希望这对那里的人来说是明智的。

编辑:已修复!请参阅以下解决方案。

这是我的代码:

// Establish Table and vars
mysql_query("CREATE TABLE IF NOT EXISTS pages(page varchar(255), content varchar(255))");
$page = 'Hello'; $content = 'This is the content.';

// Ive tried this:
mysql_query("INSERT INTO pages SET page='$page' ON DUPLICATE KEY UPDATE content='$content'");

// Ive also tried:
mysql_query("INSERT IGNORE INTO pages SET page='$page', content='$content'"));
mysql_query("INSERT IGNORE INTO pages SET page='$page'")); // No content

预期结果:创建一行,其中'page'值为'Hello'('content'值为'This is the content。')。当第二次运行脚本时,不会创建任何其他行,因为已经存在“page”值为“Hello”的行。

观察到的结果:每次运行脚本时,都会创建一个页面值为“Hello”的新行,因为这不是重复键。为什么不买?我已经尝试创建一个ID字段为AUTO_INCREMENT的表和主键,但我认为这导致了问题所以我简化了它。

(该代码是:)

mysql_query("CREATE TABLE IF NOT EXISTS pages(id INT AUTO_INCREMENT NOT NULL, page varchar(255), content varchar(255), primary key (id))");

所需结果:如果没有“page”字段为“Hello”的行,则应在表格中插入新行。一旦创建了这个,再次运行相同的脚本不应该导致新的行。

谢谢!

编辑:已修复!请参阅以下解决方案。

我的解决方案:

// Table needs a primary key to search for duplicates.
    mysql_query("CREATE TABLE IF NOT EXISTS pages(page varchar(255), content varchar(255), primary key (page))"); // Establish Table

2 个答案:

答案 0 :(得分:2)

您的page字段需要是PRIMARY KEY或者在其上具有UNIQUE索引才能使ON DUPLICATE KEY UPDATE正常工作。尝试:

CREATE TABLE IF NOT EXISTS pages(page varchar(255), content varchar(255), primary key (page))

答案 1 :(得分:2)

正如查询所说......重复 KEY 。只有在插入会违反表上的唯一约束时才触发。如果没有密钥,则DB不会扫描整个表以查看是否存在重复。