老旧系统,历史原因,因为提交接口是一个 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 2
insert tab(a,b,c) select 1,2,3
insert 并非一定要接一个 values,接一个 select 也是可以的,简单快速 |
2
killergun 2021-03-27 21:44:50 +08:00 2
|
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 1
说错了,在 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 1
caseid 如果是 unique key,可以用 insert ignore
|
11
uselessVisitor 2021-03-27 22:20:18 +08:00
case when 不能做吗。。
|
12
uselessVisitor 2021-03-27 22:36:11 +08:00
@beichenhpy 不能做。。
|
13
uselessVisitor 2021-03-27 22:45:14 +08:00 1
想到一个办法:
insert into casecheck (flag,section,checktime) select '2','8',now() where not exists(SELECT caseid FROM caseresult WHERE caseid='1897') |
14
pppguest3962 OP |
15
uselessVisitor 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 1
语法错了? INSERT INTO casecheck (flag) SELECT '2' WHERE NOT EXISTS (SELECT `caseid` FROM caseresult WHERE `caseid`='1897');
|
21
radishear 2021-03-28 01:16:57 +08:00
你这个需求用 NOT EXISTS 很适合啊
|
22
apostle 2021-03-28 01:32:45 +08:00 via Android 1
insert ignore into
|
23
radishear 2021-03-28 01:32:46 +08:00 1
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 1
一楼说的那个可以,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 1
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 1
@songpengf117 #26 对,满足语句要求用临时表名好点,更清晰。
INSERT INTO 表名 列名 SELECT 插入值 FROM dual WHERE NOT EXISTS (条件查询) 涉及唯一列再加个 IGNORE |
28
uselessVisitor 2021-03-28 10:23:37 +08:00 1
@pppguest3962 我这边测试了,没问题的。。看一下你数据表吧
|
29
suanbaner 2021-03-28 11:50:05 +08:00 1
二楼的答案里面有啊,caseid 肯定要设成 key,INSERT … ON DUPLICATE KEY UPDATE 就完事了
|
30
c6h6benzene 2021-03-28 16:15:57 +08:00 via iPhone 1
@suanbaner update 后面要加上 key=key 吧?
看到了 https://stackoverflow.com/questions/2366813/on-duplicate-key-ignore |