Mysql “在不存在的地方插入”-在本地(5.6.35)上工作,但不在服务器(5.7.22)上工作-未显示任何错误

Mysql “在不存在的地方插入”-在本地(5.6.35)上工作,但不在服务器(5.7.22)上工作-未显示任何错误,mysql,sql,phpmyadmin,Mysql,Sql,Phpmyadmin,我有以下SQL查询/语句: INSERT INTO `tags` (`tag`) SELECT 'water' FROM tags WHERE NOT EXISTS (SELECT id FROM `tags` WHERE `tag`='water') LIMIT 1 表结构只有两列id,tag SQL语句的功能是接收一个标记,在上面接收水的情况下,它检查标记是否已经存在。如果标记已存在,则应返回0个结果。如果不存在,则应使用标记创建新行 目前,它只在我的本地MAMP服务器上工作,该服务器运行

我有以下SQL查询/语句:

INSERT INTO `tags` (`tag`) SELECT 'water' FROM tags WHERE NOT EXISTS (SELECT id FROM `tags` WHERE `tag`='water') LIMIT 1
表结构只有两列id,tag

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

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

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

但是,运行该命令不会给出错误,而是显示一个绿色框,说明插入了0行。查询耗时0.0014秒


语法改变了吗?如果是的话,有人能给我指一些文件吗?我一整天都在浏览文档。

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

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和water,但是,如果我删除INSERT xxxx,则不会插入任何内容,因此不会返回任何内容

您可以尝试使用不同版本的mysql。在所有版本中似乎都是一样的

我认为一个更简单的选择是使用INSERT IGNORE语句

如果使用“忽略”修改器,则在执行 INSERT语句被忽略。例如,在不忽略的情况下,一行 复制表中现有的唯一索引或主键值 导致重复键错误,语句被中止。具有 忽略,将丢弃该行,并且不会发生错误。忽略的错误 而是生成警告


嗯,真奇怪,它在空桌子上不起作用!但我可以证实这就是问题所在。INSERT IGNORE语句似乎只是将其作为新行插入,而不管它是否存在。我认为你的回答正确,因为它解决了我问题中的问题。是的,很奇怪。虽然我找到了问题的根源,但我仍然无法理解这个设计——也许是个bug?。只要表上有主索引和/或唯一索引,INSERT IGNORE就不允许重复。是的,我会调查一下。谢谢你的帮助。
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');