在插入MySQL DB之前检查数据

时间:2013-10-15 15:25:00

标签: php mysql sql insert sql-insert

我正在创建一个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')

有什么想法吗?

4 个答案:

答案 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)

在SQL中

我会创建一个存储过程 不确定你是否可以使用mysql

if!(SELECT name FROM my_model WHERE name ='bbc') 开始 INSERT INTO my_model(status,name)VALUES('active','bbc') END