请教一条 MYSQL 语句,根据 SELECT 有无数据,进行 INSERT,或者是什么都不做...

2021-03-27 21:34:49 +08:00
 pppguest3962

老旧系统,历史原因,因为提交接口是一个 SQL 命令队列,所以这个实现,只能用 MYSQL 一条语句提交去完成判断,并且根据判断有无结果来进行是否 INSERT

分开写是这样的:

SELECT 判断有无数据

SELECT caseid FROM caseresult WHERE caseid='1897';

如果上面的查询语句查询到 [没有] 数据,则:

INSERT INTO casecheck (flag,section,checktime) VALUES ('2','8',now());

如果上面 SELECT 有数据,则什么都不做...

以上:
能不能一句 MYSQL 搞定?
谢谢解答!

3654 次点击
所在节点    MySQL
30 条回复
radishear
2021-03-28 01:16:57 +08:00
你这个需求用 NOT EXISTS 很适合啊
apostle
2021-03-28 01:32:45 +08:00
insert ignore into
radishear
2021-03-28 01:32:46 +08:00
INSERT INTO casecheck (flag) values('2') WHERE NOT EXISTS (SELECT `caseid` FROM caseresult WHERE `caseid`='1897');
pppguest3962
2021-03-28 01:40:52 +08:00
@dvvj
@radishear

反复确认了 N 次,应该语法是没错的,还是不通过
总是提示" MySQL server version for the right syntax to use near 'WHERE NOT EXISTS "
错在 WHERE
VALUE,VALUES 都试过了,``''这些符号都增加和删除过,有些怀疑是不是这样行不通,
累了,准备歇一会儿,明天再继续,问题可能很弱智,也有可能是我肤浅,麻烦大家,真不好意思...
eason1874
2021-03-28 08:47:48 +08:00
一楼说的那个可以,SQL INSERT INTO SELECT Statement,意思是插入 SELECT 出来的结果,如果 SELECT WHERE 失败那么插入就不会被执行。

虽然你插入的内容跟 SELECT 结果无关,但是一样可以运用这个逻辑,只不过插入值不写列名,直接写值而已。

如果不存在 SELECT caseid FROM caseresult WHERE caseid='1897';
就执行 INSERT INTO casecheck (flag,section,checktime) VALUES ('2','8',now());

结合起来就是
INSERT IGNORE INTO casecheck (flag, section, checktime)
SELECT '2', '8', now()
FROM caseresult WHERE NOT EXISTS (SELECT caseid FROM caseresult WHERE caseid='1897' LIMIT 1) LIMIT 1;
songpengf117
2021-03-28 08:51:01 +08:00
SQL 格式是 insert into 表名 列名 select 数据 from 临时表名 where not exists... 这里要借用临时表 dual 参考 https://blog.csdn.net/u013467442/article/details/89164215?ivk_sa=1024320u
eason1874
2021-03-28 08:59:34 +08:00
@songpengf117 #26 对,满足语句要求用临时表名好点,更清晰。

INSERT INTO 表名 列名
SELECT 插入值
FROM dual WHERE NOT EXISTS (条件查询)

涉及唯一列再加个 IGNORE
uselessVisitor
2021-03-28 10:23:37 +08:00
@pppguest3962 我这边测试了,没问题的。。看一下你数据表吧
suanbaner
2021-03-28 11:50:05 +08:00
二楼的答案里面有啊,caseid 肯定要设成 key,INSERT … ON DUPLICATE KEY UPDATE 就完事了
c6h6benzene
2021-03-28 16:15:57 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/765767

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX