【问题标题】:SQL "INSERT WHERE NOT EXISTS" syntax errorSQL“INSERT WHERE NOT EXISTS”语法错误
【发布时间】:2020-01-24 01:04:49
【问题描述】:

我有这个愚蠢的问题,MySQL 服务器有这个命令的问题:

INSERT INTO ingridients (title,text) 
VALUES(?,`MISSING INFO`) 
WHERE NOT EXISTS 
(SELECT id FROM ingridients WHERE title=?);

我收到以下错误:

Error: 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 id FROM ingridients WHERE title=?)' at line 1

我并没有经常使用 SQL,所以我找不到解决此问题的方法。有人可以帮忙吗?

【问题讨论】:

  • INSERT 通常不支持 WHERE 子句(尽管 MySQL 无论如何都不是典型的)。您是否尝试过检查与您的 MySQL 版本相对应的手册以查看它是否确实有效?您没有提供有关您使用的 MySQL 版本的信息,因此我无法提供特定链接,但您最喜欢的搜索引擎将能够使用 MySQL 文档 作为搜索短语。
  • 如果你使用WHERE title=?,你不应该改用UPDATE吗?
  • @tcadidot0:WHERE NOT EXISTS,意味着UPDATE 不适用。你不能UPDATE 一个不存在的行。
  • 看来我使用的是 8.0 版并浏览了 INSERT 的参考手册我似乎找不到它后面跟着 WHERE 子句,所以我猜你是对的应该工作。这让我再次遇到插入记录的问题,前提是它不存在。
  • 嗯,这有点奇怪。如果是这样,这意味着仅通过从插入中排除 idINSERT 分成两列值。这意味着值将是;假设表有id, title, text 列,插入将是NULL,?,'MISSING INFO' 多少行?

标签: mysql sql node.js


【解决方案1】:

你可以这样做:

INSERT INTO ingridients (title,text) 
select ?,`MISSING INFO`
FROM ingridients
WHERE NOT EXISTS 
(SELECT id FROM ingridients WHERE title=?);

【讨论】:

    【解决方案2】:

    使用子查询检查是否存在:

    INSERT INTO ingredients (title, text) 
        SELECT x.title, x.text
        FROM (SELECT ? as title, 'MISSING INFO' as text) x
        WHERE NOT EXISTS (SELECT 1 FROM ingredients i WHERE i.title = x.title);
    

    实际上,如果您不想重复标题,正确的方法是让数据库使用唯一索引或约束来验证数据完整性:

    create unique index unq_ingredients_title on title(ingredients);
    
    insert into ingredients (title, txt)
        values (?, 'MISSING INFO')
        on duplicate key update title = values(title);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 2023-02-21
      • 1970-01-01
      • 2016-01-09
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多