mysql - “在不存在的地方插入” - 在本地 (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.)
语法有变化吗?如果是这样,有人可以指出我的任何文件吗?我整天都在搜索文档。
解决方案
只要桌子上至少还有其他任何行,您的插入似乎就可以工作。如果表为空,则不执行插入。
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,该行将被丢弃并且不会发生错误。忽略的错误会生成警告。
推荐阅读
- excel - 如何将单个单元格的内容保存到单个文本文件中
- javascript - 从嵌套 JSON 创建的 JavaScript 数组的长度返回 0
- c - 如何在C中听箭头键按下
- c# - 可空引用类型和选项模式
- ios - 找不到目标“x86_64-apple-ios-simulator”的模块“MyCustomFramework”;找到:arm64、armv7-apple-ios、arm64-apple-ios、arm、armv7
- vue.js - 试图用函数增加数据
- android - 如何在 React Native 0.60+ 中实现字体系列
- ios - Flutter ios 发布构建失败,退出代码为 1
- linux - 如何清理以空格分隔的文本中未对齐的列?
- scala - 如何一次计算数据框中的两个不同出现?