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