若不想使⽤存储过程、函数等⽅式,可以通过 返回多余⼀⾏但仅期望返回⼀⾏的数据来实现
select (select 1 from dual) -- 不会抛出异常
select (select 1 from dual union all select 1 from dual) -- 会抛出异常 select (select 1, 2 from dual) -- 会抛出异常
其中 dual 为mysql⾃带的虚表,可以将dual换成业务表的⼦查询 就可以根据业务逻辑判断是否抛出异常了
使⽤场景当某个查询条件成⽴时,插⼊数据,否则抛出异常
-- 1.普通插⼊语句 向数据库中插⼊id=1的数据insert into table(id, name) valuse(1, 'lin');
-- 2.⽬标 当数据库中没有id=2的数据时插叙上⾯这条id=1的数据-- 3.探索实现⽅式 通过exists关键词 同⼀条语句处理 满⾜事务特性
insert into table(id, name) select * from (select 1,'lin') t --注意:每个派⽣出来的表都要有⾃⼰的别名 where exists (select (select 1 from dual union all select id from table where id=2));
-- 4.经验证:上⾯这种写法 不会抛异常,因为exitsts是判断是否存在,最少返回⼀⾏数据,我认为可能只是查询出了⼀条数据就返回了,没有进⾏合并操作-- 5.最终版 抛出异常 去掉exists 通过where后的条件抛出异常insert into table(id, name) select * from (select 1,'lin') t
where (select (select 1 from dual union all select id from table where id=2));
注意:如果select 的字段中有相同的值,需要加上别名,否则会报错
因篇幅问题不能全部显示,请点此查看更多更全内容