SQL查询与WHERE NOT EXISTS出错

时间:2015-01-10 19:51:03

标签: mysql sql sql-server mysqli

我的目标

我正在尝试执行以下sql查询:

INSERT INTO api(site,key) VALUES ('example.com','a-random-key') WHERE NOT EXISTS (SELECT * FROM api WHERE site='example.com');

如果不存在具有该站点的新行,则插入带有站点和相应键的新行(例如,如果没有',则插入带有关联键'a-random-key'的'example.com'与网站'example.com'的其他记录。)

什么不起作用

我收到以下错误:

  

# 1064 - 您的SQL语法出错;检查与MySQL服务器版本对应的手册,以获得正确的语法   'WHERE NOT EXISTS附近(SELECT * FROM api WHERE site ='example.com')'   在第1行

我尝试了什么

我试图分开执行这两个查询,但它们都有效。

我的问题

如何使查询有效?

2 个答案:

答案 0 :(得分:3)

正如人们所建议的那样,更好的方法是在站点列上添加唯一索引(如果站点存在,则不会插入它)。无论如何,如果那不是一个选项,我会尝试这个查询:

INSERT INTO api(site, `key`)
SELECT * FROM (SELECT 'example.com','a-random-key') AS tmp
WHERE NOT EXISTS (SELECT * FROM api WHERE site='example.com') LIMIT 1;

答案 1 :(得分:2)

我想你想尝试这样的事情:

INSERT INTO api (site, `key`)
SELECT 'example.com','a-random-key'
  FROM dual
 WHERE NOT EXISTS (SELECT * FROM api WHERE site='example.com');

我不认为WHERE NOT EXISTS可以在没有select的INSERT查询中使用。请参阅SQL Fiddle demo here。此外,如果您不使用SELECT,则上述FROM dual语句不起作用。

UPDATE 第二个问题是列key应该被反引号包围......我认为MySQL会因为它是一个保留字而窒息而已。