甲骨文日记(4)-oracle9i INSERT Statement

insert可以向表或者视图中插入数据,insert可以分为单表插入多表插入,我们先来看看单表插入

1.insert into a single table

甲骨文日记(4)-oracle9i INSERT Statement_第1张图片

 单表插入的语法如上所示,insert into 后面紧跟视图名或者表名,视图名或者表名用schema.table或者schema.view的全名,也可以省略schema,只写表名或者视图名。

 那么什么时候需要写schema,什么情况下需要省略呢?当我们使用当前用户的schema里面的数据库对象时,schema可以省略,当我们使用其他用户的schema时,因为不同schema里面的数据库对象允许同名,所以schema不可省略。

 table或者view后面可以跟若干列名,也可以省略,省略时默认表示所有列。

 讲了这么多没有例子怎么可以呢?

 下面是本文章使用的表结构和建表的代码:

create table insert_test(
  id number(6,0) not null,
  name varchar2(20) not null,
  school varchar2(20)
);
desc insert_test;
甲骨文日记(4)-oracle9i INSERT Statement_第2张图片

 我们有三个列,id,name和school,id和name不允许NULL值,也没有默认值。school允许NULL值插入。

 下面我来验证单表插入的两种语法:

 首先是不省略列名,不省略列名时,指定了Not NULL且没有默认值的列不能被省略,允许NULL值或者有默认值的列可以省略;当省略列名时,默认相当于指定了所有列,values的参数必须和表所有列的数量、类型、先后顺序一一对应。即使某个列允许NULL值或者有默认值,values里面也不能省略。

甲骨文日记(4)-oracle9i INSERT Statement_第3张图片

 如上图所示,我们发现前两条语句插入成功,第三条插入失败,这证明了省略列名时,values里面的所有列都不能省略。如果省略,系统会报错“没有足够的值”。再看看下面的例子,如下图所示,当我们试图省略一个Not NULL的列时,系统会报错“无法将NULL值插入……”。

甲骨文日记(4)-oracle9i INSERT Statement_第4张图片

 我们知道,有的SQL语言还支持省略values关键字,直接是“insert into table(value1,value2……)”,经过试验,oracle 9i不支持省略values的语法

甲骨文日记(4)-oracle9i INSERT Statement_第5张图片

 有的数据库还支持用逗号分开多个values语句,实现一个insert插入多行数据,经过测试,oracle 9i也不支持多个values

甲骨文日记(4)-oracle9i INSERT Statement_第6张图片

2.insert into multiple table

甲骨文日记(4)-oracle9i INSERT Statement_第7张图片

 oracle的多表插入语句,允许我们在一条insert语句中把某几行数据插入到多张表中。如上图所示,多表插入的语法如图片的下半部分所示,上半部分是INTO clause,多表插入的语法允许我们在insert后面跟ALL/FIRST关键字,ALL表示对于每一个WHEN分枝,都会判断condition是否成立,成立就执行相应的INTO clause,而FIRST关键字是从前往后,只要某一个WHEN分枝的condition条件成立,只执行当前WHEN分支的INTO clause,对于后面的WHEN不在判断直接跳过。

INSERT ALL
WHEN prod_category=’B’ THEN
  INTO book_sales(prod_id,cust_id,qty_sold,amt_sold)
    VALUES(product_id,customer_id,sale_qty,sale_price)
WHEN prod_category=’V’ THEN
  INTO video_sales(prod_id,cust_id,qty_sold,amt_sold)
    VALUES(product_id,customer_id,sale_qty,sale_price)
WHEN prod_category=’A’ THEN
  INTO audio_sales(prod_id,cust_id,qty_sold,amt_sold)
    VALUES(product_id,customer_id,sale_qty,sale_price)
SELECT prod_category ,product_id ,customer_id ,sale_qty
  ,sale_price
FROM sales_detail;
 比如上面的代码中,因为是INSERT ALL,所以会判断每一个WHEN分枝,当WHEN后面的表达式为true时,就执行对应的INTO clause。

 如果把ALL/FIRST关键字,WHEN condition THEN去掉,我们发现多表插入的语法和多表插入的语法非常类似,只是除了第一个values语句,剩下的都需要补insert关键字,同时把逗号改成分号,就可以吧多表插入语句改成多条单表插入语句了。

你可能感兴趣的:(oracle)