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

nnt7mjpx  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(239)

我有以下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个结果。如果它不存在,它应该创建一个带有标记的新行。
目前,它只在我的本地mamp服务器上工作,该服务器运行mysql版本5.6.35)。我在另外两个mysql版本上进行了测试,5.6.39-log和5.7.22。。。但似乎都没用。
显示的唯一错误是在运行查询之前:

但是,运行它不会给出一个错误,而是一个绿色的框 0 rows inserted. (Query took 0.0014 seconds.) 语法改变了吗?如果是的话,有人能告诉我一些文件吗?我一整天都在查文件。

ercv8c1e

ercv8c1e1#

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

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行(x和water),但是,如果删除insert x,则不会插入任何内容,因此不会返回任何内容。
看这里。您可以尝试使用不同版本的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时,将丢弃该行,并且不会发生错误。忽略的错误将生成警告。
https://dev.mysql.com/doc/refman/8.0/en/insert.html

相关问题