Oracle insert的扩展


向一个表发散弹枪

⑴ insert into table_name [(column[,column...])] select_statement
每次只能插入一个表,但性能上比写多条insert语句要高。另外,Oracle还提供create table table_name as select ...,as不可少!实现直接创建并且插入表,依赖于后面的select语句的结果,如:create table new_table as select * from source_table where 1=0
案例:
表mxt新增一列time,那么这个列会被置在最后,现想把此列放于第2
create table copy_mxt as select id,time,name from mxt;
drop table mxt;
rname copy_mxt to mxt;

向多个表发散弹枪

类型:
            ① 无条件的insert
            ② 带条件的insert all
            ③ 带条件的insert first
            ④ pivoting insert

多表insert的使用限制:
            ① 只能对table使用insert,不能对视图或物化视图使用
            ② 不能对远程表使用这个插入操作
            ③ 多表插入时,不能指定一个表的集操作
            ④ 多表insert的into的目标表加在一起的列数不能超过999

无条件的insert
             语法:
             insert all
             into dest_table1 [column(,column...)] [values (...)]
             into dest_table2 [column(,column...)] [values (...)]
             ...
             select_statement  --values中指定是select结果列,如果没有values指定列,那么表示目标表的列类型和顺序与select语句查询的结果完全一致。建议不要省略目标表中的列和values,增强可读性。

例子:

  1. create table emp_1 as select employee_id,last_name from employees where 1=0;  
  2. create table emp_2 as select * from employees where 1=0;  
  3. create table emp_3 as select * from employees where 1=0;  
  4. insert all  
  5. --不指定emp_1后面的列,也没有values指定列,那么emp_1所有列类型和顺序与查询的列的类型和顺序一致   
  6. --也就是emp_1中只有查询结果中的那几列,而且类型和顺序一致   
  7.   into emp_1  
  8. --指定了emp_2后面的列,但没有values指定列,表示emp_2中要插入的列被选择出来,与查询结果列的类型和顺序一致   
  9. --emp_2也有很多列,不止这两列   
  10.   into emp_2(employee_id,last_name)  
  11. --指定emp_3后面的列和values指定列,那么values后面的列名必须与查询结果一致,如果查询有别名,必须在values中使用别名   
  12. --emp_3指定的列的类型和顺序必须与values保持一致   
  13. --emp_3也可能列数大于指定列数   
  14.   into emp_3(employee_id,last_name) values(e_id,e_last_name)  
  15.   select employee_id e_id,last_name e_last_name   
  16.    from employees  
  • 1
  • 2
  • 3
  • 下一页

相关内容