在插入 MySQL 数据库之前检查数据


Checking for data before inserting into MySQL DB

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

我想出的查询对我来说看起来很合理。但是由于某种原因,它给了我一个语法错误。是的,我已经RTFM了。我已经用谷歌搜索过了。根据我看到的其他例子(即使在Stack Exchange上),它对我来说是正确的。谁能确定我做错了什么?

查询:

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

有什么想法吗?

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

试试这个:

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

你想要INSERT IGNORE而不是NOT EXISTS,如果name是主键/唯一键。如果遇到重复键错误,这将不会插入任何内容。如果要更新行已存在的列,也可以使用 ON DUPLICATE KEY UPDATE

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

如果!(从名称 = "BBC"my_model中选择名称)开始插入my_model(状态、名称)值("活动"、"BBC")结束