MySQL 5.5.30仅在不存在的情况下插入INSERT

时间:2014-04-15 08:37:12

标签: mysql sql insert unique

我正在尝试插入一行,但前提是它还不存在。

我已经浏览了论坛,这个语法似乎就是我想要的:

INSERT INTO tblSites (site,homepage) VALUES ('A','www.a.com') 
WHERE NOT EXISTS (SELECT * FROM tblSites where homepage='www.a.com')

我收到语法错误。

You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right
syntax to use near 'WHERE NOT EXISTS (SELECT * FROM tblSites where homepage='www.a.com')' 
at line 1

我已经阅读过并且每个人似乎都在使用这种语法,它在我使用的版本中是不可用的还是什么?我在下面列出了其他一些选项,但我想了解为什么这对我自己的学习(和理智)不起作用。

我看过的其他方法是:

1)更换。在我打算使用此查询的其他一些领域,我有数百万行和重复可能。如果它在效率方面与上述语法相当,我只想使用REPLACE。有什么想法吗?

2)INSERT IGNORE。可能值得使用这个,tblSites目前有(siteId,name,homepage)。我可以将主页设为id,因为它将是唯一的,然后我相信这会工作(?),但我也使用tblContentSites(siteId,contentId)将此表链接到tblContent(网站上的内容),复合键为siteId +内容识别。我觉得每次在联结表中重复一个整数ID会比主页更好。也很欣赏这方面的想法。

3)ON DUPLICATE KEY UPDATE - 这似乎是我复制行但只是给新的一个不同的ID,这无异于重复数据,并可能导致我的问题。我误解了这个用法吗? DUPLICATE KEY UPDATE后我有更多的灵活性做什么?

非常感谢,

德鲁

1 个答案:

答案 0 :(得分:2)

两个步骤:

  1. homepage列上添加唯一约束(如果您尚未这样做):

    ALTER TABLE `tblSites` ADD UNIQUE(`homepage`)
    
  2. 只有在不会导致冲突的情况下才使用INSERT IGNORE

    INSERT IGNORE INTO `tblSites` (`site`, `homepage`) VALUES ('A','www.a.com');