首页 > 解决方案 > “在不存在的地方插入” - 在本地 (5.6.35) 上工作,但不在服务器 (5.7.22) 上工作 - 不显示错误

问题描述

我有以下 SQL 查询/语句:

INSERT INTO `tags` (`tag`) SELECT 'water' FROM tags WHERE NOT EXISTS (SELECT id FROM `tags` WHERE `tag`='water') LIMIT 1

表结构只有 2 列(id, tag)

SQL 语句的功能是接收一个标签,在上面收到的情况下water,它检查标签是否已经存在。如果标签已经存在,它应该返回 0 个结果。如果它不存在,它应该使用标签创建一个新行。

目前,它仅适用于运行 MySQL 5.6.35 版的本地 MAMP 服务器)。我已经在另外两个 MySQL 版本上进行了测试,5.6.39-log 和 5.7.22 ......但它们似乎都不起作用。

唯一显示的错误是在我运行查询之前: 之前显示的错误

但是,运行不会给出错误,而是一个绿色框说明0 rows inserted. (Query took 0.0014 seconds.)

语法有变化吗?如果是这样,有人可以指出我的任何文件吗?我整天都在搜索文档。

标签: mysqlsqlphpmyadmin

解决方案


只要桌子上至少还有其他任何行,您的插入似乎就可以工作。如果表为空,则不执行插入。

create table tags(id integer, tag varchar(255));
commit;

insert into tags (tag) values('xxxx');
COMMIT;

INSERT INTO `tags` (`tag`) SELECT 'water' FROM tags WHERE NOT EXISTS (SELECT id FROM `tags` WHERE `tag`='water') LIMIT 1;
COMMIT;

select * from tags

它返回 2 行(xxxx 和水) 但是,如果我删除 INSERT xxxx,则不会插入任何内容,因此不会返回任何内容。

看这里。您可以尝试使用不同版本的mysql。它似乎在所有版本中的行为方式都相同

我相信一个更简单的替代方法是使用INSERT IGNORE声明。

https://www.db-fiddle.com/f/aDZpjz3K1L15bc69bUDkEz/0

insert ignore into tags  values(1,'xxxx');
insert ignore into tags  values(1,'xxxx');
insert ignore into tags  values(1,'xxxx');

insert ignore into tags  values(2,'water');
insert ignore into tags  values(2,'water');
insert ignore into tags  values(2,'water');

如果使用 IGNORE 修饰符,则执行 INSERT 语句时发生的错误将被忽略。例如,如果没有 IGNORE,复制表中现有 UNIQUE 索引或 PRIMARY KEY 值的行会导致重复键错误并且语句被中止。使用 IGNORE,该行将被丢弃并且不会发生错误。忽略的错误会生成警告。

https://dev.mysql.com/doc/refman/8.0/en/insert.html


推荐阅读