我正在尝试执行以下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行
我试图分开执行这两个查询,但它们都有效。
如何使查询有效?
答案 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会因为它是一个保留字而窒息而已。