2

我正在创建一个 SQL 脚本,该脚本将在新环境中运行时将特定条目添加到数据库中。但我想在尝试插入数据之前必须插入查询以确保数据不存在。

我提出的问题对我来说听起来很合理。但由于某种原因,它给了我一个语法错误。是的,我已经 RTFM 了。我已经谷歌了。根据我看到的其他示例(甚至在 Stack Exchange 上),它看起来对我来说是正确的。谁能确定我做错了什么?

询问:

INSERT INTO my_model (status, name) VALUES ('active', 'bbc')
WHERE NOT EXISTS (SELECT name FROM my_model WHERE name = 'bbc')

有任何想法吗?

4

4 回答 4

4

平原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,所以我无法确定它。

于 2013-10-15T15:32:31.763 回答
1

尝试这个:

INSERT INTO my_model (status, name) select('active', 'bbc') from my_model
WHERE NOT EXISTS (SELECT name FROM my_model WHERE name = 'bbc');
于 2013-10-15T15:31:12.607 回答
0

您想要代替, if是主键/唯一键。如果遇到重复键错误,则不会插入任何内容。如果要更新列,如果行已经存在,也可以使用。 INSERT IGNORENOT EXISTSnameON DUPLICATE KEY UPDATE

于 2013-10-15T15:27:48.933 回答
0

在sql中我会创建一个存储过程,不确定你是否可以在mysql中

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

于 2013-10-15T15:28:21.533 回答