oracle中insert all的用法
現在有個需求:將數據插入多個表中。怎么做呢?可以使用insert into語句進行分別插入,但是在oracle中有一個更好的實現方式:使用insert all語句。
insert all語句是oracle中用於批量寫數據的 。insert all分又為無條件插入和有條件插入。
一、表和數據准備
--創建表
CREATE TABLE stu(
ID NUMBER(3),
NAME VARCHAR2(30),
sex VARCHAR2(2)
);
--刪除表
drop table stu;
drop table stu1;
drop table stu2;
--向stu表中插入數據
INSERT INTO stu(ID, NAME, sex) VALUES(1, '成都', '女');
INSERT INTO stu(ID, NAME, sex) VALUES(2, '深圳', '男');
INSERT INTO stu(ID, NAME, sex) VALUES(3, '上海', '女');
--復制表結構創建表stu1,stu2
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類型
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 類型
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 無法支持序列插入,會導致兩邊不一致。
五、參考博文
(1) https://www.cnblogs.com/myrunning/p/4386004.html
(2) https://blog.csdn.net/ghostgant/article/details/5700228
(3) https://www.cnblogs.com/hrhguanli/p/3773020.html
(4) https://www.cnblogs.com/shoshana-kong/p/9340391.html