【问题标题】:MySQL 5.5.30 INSERT only if not existsMySQL 5.5.30 只有在不存在时才插入
【发布时间】:2014-04-15 08:37:11
【问题描述】:

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

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

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)插入忽略。可能值得使用这个,tblSites 当前有(siteId,name,homepage)。我可以将主页设置为 id,因为它将是唯一的,然后我相信这会起作用(?),但我还使用 tblContentSites (siteId,contentId) 将此表链接到 tblContent(网站上的内容)和复合键 siteId+内容标识。我觉得每次在那个联结表中重复一个整数 ID 会比主页更好。也感谢对​​此的想法。

3)关于重复键更新-在我看来,这似乎是复制行,但只是给新行一个不同的 ID,这无异于复制数据,可能会导致我的问题。我误解了这个的用途吗?在 DUPLICATE KEY UPDATE 之后我可以更灵活地做什么?

非常感谢,

画了

【问题讨论】:

  • 您在哪里得到语法错误,是哪一个?请粘贴错误。
  • 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“WHERE NOT EXISTS (SELECT * FROM tblSites where homepage='www.a.com')”附近使用正确的语法

标签: mysql sql insert unique


【解决方案1】:

两步:

  1. homepage 列上添加唯一约束(如果您还没有这样做的话):

    ALTER TABLE `tblSites` ADD UNIQUE(`homepage`)
    
  2. 使用INSERT IGNORE 仅在不会导致冲突的情况下插入。

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

【讨论】:

  • 谢谢杰克。你是说我对在 tblContentSites 中使用主页作为 Id 的担忧是不合理的吗?
  • @user3535031 Jack 并没有改变你的主键,他只是在表中添加了一个新的约束,上面写着“这个列也是唯一的”
  • 啊,我明白了,好的,谢谢!如果您对此有任何想法,我仍然很想知道为什么当前的语法不起作用,但会继续使用 Jack 的方法。
  • @user3535031 如果主页是自然主键,那么一定要这样做..否则添加单独的索引会更有意义。
  • @user3535031 至于为什么您的查询出现错误;根本不可能在 INSERT 语句中使用 WHERE :)
猜你喜欢
  • 1970-01-01
  • 2013-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-25
  • 2011-03-25
  • 1970-01-01
相关资源
最近更新 更多