现在有个需求:将数据插入多个表中。怎么做呢?可以使用insert into语句进行分别插入,但是在oracle中有一个更好的实现方式:使用insert all语句。
insert all语句是oracle中用于批量写数据的 。insert all分又为无条件插入和有条件插入。
一、表和数据准备
CREATE TABLE stu(
ID NUMBER(3),
NAME VARCHAR2(30),
sex VARCHAR2(2)
);
INSERT INTO stu(ID, NAME, sex) VALUES(1, '成都', '女');
INSERT INTO stu(ID, NAME, sex) VALUES(2, '深圳', '男');
INSERT INTO stu(ID, NAME, sex) VALUES(3, '上海', '女');
CREATE TABLE stu1 AS SELECT t.* FROM stu t WHERE 1 = 2;
CREATE TABLE stu2 AS SELECT t.* FROM stu t WHERE 1 = 2;
select * from stu;
select * from stu1;
select * from stu2;
二、insert all无条件插入
将stu表中的数据插入stu1和stu2表中可以这样写
insert all
into stu1 values(id,name,sex)
into stu2 values(id,name,sex)
select id,name,sex from stu;
三、insert all有条件插入
有条件插入又分为两种:insert all when…和insert first when…
insert all
when id=1 then
into stu1 values(id,name,sex)
when id=2 then
into stu2 values(id,name,sex)
else
into stu1 values(id,name,sex)
select id,name,sex from stu;
结果如下:
insert first
when id<=2 then
into stu1 values(id,name,sex)
when id<=3 then
into stu2 values(id,name,sex)
select id,name,sex from stu;
结果如下:
四、insert all和insert first的区别
insert first是考虑先后关系的,如果有数据满足第一个when条件又满足第二个when条件,则执行第一个then插入语句,第二个then就不插入。反之有数据不满足第一个when条件且满足第二个when条件,则数据会插入第二个条件下对应的表中,这也正是insert first与inset all的区别。
简单来说就是all只要满足条件,就会插入,这个会造成重复插入;first只要有一个满足条件,后面的条件不再判断,不会造成重复插入。
注意:insert all 无法支持序列插入,会导致两边不一致。