
老旧系统,历史原因,因为提交接口是一个 SQL 命令队列,所以这个实现,只能用 MYSQL 一条语句提交去完成判断,并且根据判断有无结果来进行是否 INSERT
分开写是这样的:
SELECT caseid FROM caseresult WHERE caseid='1897';
INSERT INTO casecheck (flag,section,checktime) VALUES ('2','8',now());
以上:
能不能一句 MYSQL 搞定?
谢谢解答!
1 xiangyuecn 2021-03-27 21:42:02 +08:00 insert tab(a,b,c) select 1,2,3 insert 并非一定要接一个 values,接一个 select 也是可以的,简单快速 |
2 killergun 2021-03-27 21:44:50 +08:00 |
3 qazwsxkevin 2021-03-27 21:52:27 +08:00 楼上两位理解不是这样的,也可能我没说清楚,并非是为了防重复 语句是通过 String 操作组装起来的, 语句的根本逻辑是,判断 A 事情是否有,但做的 B 事情,跟 A 事情完全没有关系,并且是两个不同的逻辑。 |
  4 qazwsxkevin 2021-03-27 21:53:45 +08:00 |
5 qazwsxkevin 2021-03-27 21:57:01 +08:00 B 的事情,完全不借助 A 的内容,只是判断 A 在这张表里有没有匹配 WHERE 的数据,有就 INSERT 另外一套组装好的数据,没有就什么都不做 |
6 qazwsxkevin 2021-03-27 21:58:12 +08:00 刚才同事忘了 Logout 自己账号,所以用了他的账号发了贴,抱歉 |
7 yjxjn 2021-03-27 22:01:55 +08:00 via iPhone isnull 写一条就完事了 |
8 yjxjn 2021-03-27 22:03:21 +08:00 via iPhone 说错了,在 oracle 里面 nvl 或者 nvl2 解决了 |
9 Ptu2sha 2021-03-27 22:03:29 +08:00 所以 你是没看过 if 语句? |
10 monsterxx03 2021-03-27 22:10:23 +08:00 via Android caseid 如果是 unique key,可以用 insert ignore |
11 zm8m93Q1e5otOC69 2021-03-27 22:20:18 +08:00 case when 不能做吗。。 |
12 zm8m93Q1e5otOC69 2021-03-27 22:36:11 +08:00 @beichenhpy 不能做。。 |
13 zm8m93Q1e5otOC69 2021-03-27 22:45:14 +08:00 想到一个办法: insert into casecheck (flag,section,checktime) select '2','8',now() where not exists(SELECT caseid FROM caseresult WHERE caseid='1897') |
14 pppguest3962 OP |
15 zm8m93Q1e5otOC69 2021-03-27 22:54:41 +08:00 @pppguest3962 你看一下我最新的一条回复,应该可以,我自己试了一下 |
16 xmpx310 2021-03-27 23:27:09 +08:00 replace into ? |
17 mingl0280 2021-03-27 23:42:05 +08:00 via Android 往数据库里插存储过程呗,调用就一句了。 |
18 l00t 2021-03-28 00:02:12 +08:00 一楼就告诉你答案了…… |
19 pppguest3962 OP @beichenhpy 谢谢,我试着测试一下,我这里测试没通过。。。。 INSERT INTO casecheck `flag` SELECT '2' WHERE NOT EXISTS (SELECT `caseid` FROM caseresult WHERE `caseid`='1897'); 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '`flag` SELECT '2' WHERE NOT EXISTS (SELECT `caseid` FROM caseresult WHERE `case' at line 1 时间: 0.001s |
20 dvvj 2021-03-28 01:15:11 +08:00 语法错了? INSERT INTO casecheck (flag) SELECT '2' WHERE NOT EXISTS (SELECT `caseid` FROM caseresult WHERE `caseid`='1897'); |
21 XLeopard 2021-03-28 01:16:57 +08:00 你这个需求用 NOT EXISTS 很适合啊 |
22 apostle 2021-03-28 01:32:45 +08:00 via Android insert ignore into |
23 XLeopard 2021-03-28 01:32:46 +08:00 INSERT INTO casecheck (flag) values('2') WHERE NOT EXISTS (SELECT `caseid` FROM caseresult WHERE `caseid`='1897'); |
24 pppguest3962 OP |
25 eason1874 2021-03-28 08:47:48 +08:00 nbsp; 一楼说的那个可以,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; |
26 songpengf117 2021-03-28 08:51:01 +08:00 via iPhone SQL 格式是 insert into 表名 列名 select 数据 from 临时表名 where not exists... 这里要借用临时表 dual 参考 https://blog.csdn.net/u013467442/article/details/89164215?ivk_sa=1024320u |
27 eason1874 2021-03-28 08:59:34 +08:00 @songpengf117 #26 对,满足语句要求用临时表名好点,更清晰。 INSERT INTO 表名 列名 SELECT 插入值 FROM dual WHERE NOT EXISTS (条件查询) 涉及唯一列再加个 IGNORE |
28 zm8m93Q1e5otOC69 2021-03-28 10:23:37 +08:00 @pppguest3962 我这边测试了,没问题的。。看一下你数据表吧 |
29 suanbaner 2021-03-28 11:50:05 +08:00 二楼的答案里面有啊,caseid 肯定要设成 key,INSERT … ON DUPLICATE KEY UPDATE 就完事了 |
30 c6h6benzene 2021-03-28 16:15:57 +08:00 via iPhone @suanbaner update 后面要加上 key=key 吧? 看到了 https://stackoverflow.com/questions/2366813/on-duplicate-key-ignore |