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

时间:2018-07-26 06:30:55

标签: 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语句功能是接收标记,在上面的情况下,它接收water,它检查标记是否已存在。如果标记已经存在,则应返回0个结果。如果不存在,则应使用标签创建一个新行。

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

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

但是,运行该命令不会产生错误,但是会显示一个绿色框,指出0 rows inserted. (Query took 0.0014 seconds.)

语法是否已更改?如果是这样,有人可以指出我的任何文档吗?我整天都在搜寻文档。

1 个答案:

答案 0 :(得分:1)

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

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,则不会插入任何内容,因此也不会返回任何内容。

See here.您可以尝试使用不同版本的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值   导致重复键错误,并且语句中止。用   忽略,该行将被丢弃,并且不会发生错误。忽略的错误   而是生成警告。

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