oracle
不像mysql
那样可以在values
后面添加多个插入的值,mysql
具体操作
mysql插入多条数据
-- mysql插入多行代码
insert into CB_PRACTICE(id_, type_,remark) values (5,'物理','浮力'),(6,'物理','阻力');
1.采用union all拼接查询方式
-- oracle插入多行代码
insert into CB_PRACTICE(id_, type_,remark)
select 5,'物理','浮力' from dual
union all select 6,'物理','阻力' from dual;
2.采用insert all的方式
-- oracle插入多行代码
INSERT ALL
INTO CB_PRACTICE(id_, type_,remark) VALUES (7,'语文','唐诗')
INTO CB_PRACTICE(id_, type_,remark) VALUES (8,'语文','宋词')
SELECT * FROM DUAL;
效果等同于
INTO CB_PRACTICE(id_, type_,remark) VALUES (7,'语文','唐诗');
INTO CB_PRACTICE(id_, type_,remark) VALUES (8,'语文','宋词');
另外,insert all还支持往不同的表里插入数据,如:
insert all
into table1(filed1,filed2)values('value1','value2')
into table2(字段1,字段2,字段3) values(值1,值2,值3)
select * from dual;
你可能会感到很疑问,为什么后面都要跟select * from dual
?
因为INSERT ALL一定要跟select,就加一个系统表来作为无明确对象的select操作 ,如果你不加select,则语句报错
官方解释:
“ALL into_clause: Specify ALL followed by multiple insert_into_clauses to perform an unconditional multitable insert. Oracle Database executes each insert_into_clause once for each row returned by the subquery.”
指定ALL后跟多个insert_into_clauses以执行无条件多表插入。Oracle数据库对子insert_into_clause查询返回的每一行执行一次。
注意:select * from dual
只有一条记录,所以上面的操作只会返回一条记录,如果你有自动增长的主键这里通过sequence获取的值是同一个,不会自动获取多个,所以id需要通过其他方式设置(例如触发器方式自动设置id)
具体dual表的介绍:Oracle中DUAL表到底是什么?如何使用?