我有以下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.)
语法是否已更改?如果是这样,有人可以指出我的任何文档吗?我整天都在搜寻文档。
答案 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值 导致重复键错误,并且语句中止。用 忽略,该行将被丢弃,并且不会发生错误。忽略的错误 而是生成警告。