我正在尝试插入一行,但前提是它还不存在。
我已经浏览了论坛,这个语法似乎就是我想要的:
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后我有更多的灵活性做什么?
非常感谢,
德鲁
答案 0 :(得分:2)
两个步骤:
在homepage
列上添加唯一约束(如果您尚未这样做):
ALTER TABLE `tblSites` ADD UNIQUE(`homepage`)
只有在不会导致冲突的情况下才使用INSERT IGNORE
。
INSERT IGNORE INTO `tblSites` (`site`, `homepage`) VALUES ('A','www.a.com');