我正在创建一个SQL脚本,该脚本将在新环境中运行时向数据库添加特定条目。但是我想要INSERT查询以确保在尝试插入数据之前数据尚不存在。
我想出的查询对我来说听起来很合理。但由于某种原因,它给我一个语法错误。是的,我有RTFM了。我用Google搜索了它。基于我见过的其他例子(即使在Stack Exchange上),它对我来说也是正确的。谁能确定我做错了什么?
查询:
INSERT INTO my_model (status, name) VALUES ('active', 'bbc')
WHERE NOT EXISTS (SELECT name FROM my_model WHERE name = 'bbc')
有什么想法吗?
答案 0 :(得分:3)
普通INSERT
不允许WHERE
。如果主键为(status, name)
,则使用INSERT IGNORE
作为@aynber存在。如果没有,请尝试INSERT ... SELECT
:
INSERT INTO my_model (status, name)
SELECT 'active', 'bbc'
FROM DUAL
WHERE NOT EXISTS (SELECT name FROM my_model WHERE name = 'bbc');
DUAL
是系统提供的单行表,用于保证SELECT 'active', 'bbc' FROM DUAL
之类的结果的一行结果。它是Oracle的“发明”,但在MySQL中得到支持。您可以从查询中删除FROM DUAL
;我今天没有MySQL,所以我无法测试它。
答案 1 :(得分:1)
试试这个:
INSERT INTO my_model (status, name) select('active', 'bbc') from my_model
WHERE NOT EXISTS (SELECT name FROM my_model WHERE name = 'bbc');
答案 2 :(得分:0)
如果NOT EXISTS
是主要/唯一密钥,则需要 INSERT IGNORE
而不是name
。如果遇到重复键错误,则不会插入任何内容。如果要在行已存在的情况下更新列,也可以使用ON DUPLICATE KEY UPDATE
。
答案 3 :(得分:0)
我会创建一个存储过程 不确定你是否可以使用mysql
if!(SELECT name FROM my_model WHERE name ='bbc') 开始 INSERT INTO my_model(status,name)VALUES('active','bbc') END