INSERT
向表中添加一行或多行数据。
本文档只介绍INSERT语句兼容Oracle的特性,原Vastbase的INSERT语法未做删除和修改,详见INSERT。
Vastbase在Oracle兼容模式下,支持INSERT语句如下特性用法:
INSERT ALL&FIRST子句语法
功能描述
Insert All&First语句允许用户在一条Insert语句中往不同的表同时插入数据,也可以实现有条件的插入。
Insert All表示所有满足条件的插入语句都会被执行,并且INSERT All支持针对指定字段批量插入数据。
Insert First在执行第一个满足条件的插入语句后就会结束。
语法格式
Insert [ First | All ]
[ WHEN { Condition } THEN INTO table [ [ AS ] alias ] [(column_name[,...])] Values (v1, ...), ...]
{ Subquery }
参数说明
WHEN { Condition }
任意一个判断表达式。
表达式中可以使用常量或引用查询中的表字段。
alias
表的别名。
column_name[,…]
指定字段的名称序列。
指定字段功能即column_name选项仅在数据库兼容模式为Oracle时支持(即数据库实例初始化时指定DBCOMPATIBILITY='A')。
指定字段功能暂不支持视图操作、自增列和with语法。
Subquery
子查询语句。
示例
示例1: 实现有条件的往不同的表批量插入数据。
1、创建测试表并插入数据。
CREATE TABLE small_orders
( order_id NUMERIC NOT NULL,
customer_id NUMERIC NOT NULL,
order_total NUMERIC );
CREATE TABLE medium_orders AS SELECT * FROM small_orders;
CREATE TABLE large_orders AS SELECT * FROM small_orders;
CREATE TABLE special_orders
( order_id NUMERIC NOT NULL,
customer_id NUMERIC NOT NULL,
order_total NUMERIC,
other NUMERIC
);
CREATE TABLE orders
( order_id NUMERIC NOT NULL,
customer_id NUMERIC NOT NULL,
order_total NUMERIC ,
other NUMERIC );
INSERT INTO orders SELECT 1, 1, 10000, 1 ;
INSERT INTO orders SELECT 1, 1, 20000, 1 ;
INSERT INTO orders SELECT 1, 1, 30000, 1 ;
INSERT INTO orders SELECT 1, 1, 210000, 1 ;
INSERT INTO orders SELECT 1, 1, 220000, 1 ;
INSERT INTO orders SELECT 1, 1, 110000, 1 ;
INSERT INTO orders SELECT 1, 1, 120000, 1 ;
INSERT INTO orders SELECT 1, 1, 130000, 1 ;
INSERT INTO orders SELECT 1, 1, 140000, 1 ;
INSERT INTO orders SELECT 1, 1, 140000, 1 ;
INSERT INTO orders SELECT 1, 1, 340000, 1 ;
2、使用INSERT ALL向不同表中插入数据。
INSERT ALL
WHEN ottl < 100000 THEN
INTO small_orders
VALUES(oid, ottl, cid)
WHEN ottl > 100000 and ottl < 200000 THEN
INTO medium_orders
VALUES(oid, ottl, cid)
WHEN ottl > 200000 THEN
into large_orders
VALUES(oid, ottl, cid)
SELECT o.order_id oid, o.customer_id cid, o.order_total ottl,
o.other
FROM orders o;
3、查询INSERT ALL结果。
select * from small_orders;
select * from medium_orders;
select * from large_orders;
select * from special_orders;
返回结果依次如下,则表示插入数据成功:
order_id | customer_id | order_total
----------+-------------+-------------
1 | 10000 | 1
1 | 20000 | 1
1 | 30000 | 1
(3 rows)
order_id | customer_id | order_total
----------+-------------+-------------
1 | 110000 | 1
1 | 120000 | 1
1 | 130000 | 1
1 | 140000 | 1
1 | 140000 | 1
(5 rows)
order_id | customer_id | order_total
----------+-------------+-------------
1 | 210000 | 1
1 | 220000 | 1
1 | 340000 | 1
(3 rows)
order_id | customer_id | order_total | other
----------+-------------+-------------+-------
(0 rows)
4、使用INSERT FIRST向不同表中插入数据。
INSERT First
WHEN ottl > 10000 THEN
INTO small_orders
VALUES(oid, ottl, cid)
INTO small_orders
VALUES(oid, ottl, cid)
INTO small_orders
VALUES(oid, ottl, cid)
WHEN ottl > 100000 THEN
INTO medium_orders
VALUES(oid, ottl, cid)
WHEN ottl > 200000 THEN
into large_orders
VALUES(oid, ottl, cid)
SELECT o.order_id oid, o.customer_id cid, o.order_total ottl,
o.other
FROM orders o;
5、查询INSERT First结果。
small_orders表
select * from small_orders;
返回结果如下,则表示插入数据成功:
order_id | customer_id | order_total ----------+-------------+------------- 1 | 10000 | 1 1 | 20000 | 1 1 | 30000 | 1 1 | 20000 | 1 1 | 20000 | 1 1 | 20000 | 1 1 | 30000 | 1 1 | 30000 | 1 1 | 30000 | 1 1 | 210000 | 1 1 | 210000 | 1 1 | 210000 | 1 1 | 220000 | 1 1 | 220000 | 1 1 | 220000 | 1 1 | 110000 | 1 1 | 110000 | 1 1 | 110000 | 1 1 | 120000 | 1 1 | 120000 | 1 1 | 120000 | 1 1 | 130000 | 1 1 | 130000 | 1 1 | 130000 | 1 1 | 140000 | 1 1 | 140000 | 1 1 | 140000 | 1 1 | 140000 | 1 1 | 140000 | 1 1 | 140000 | 1 1 | 340000 | 1 1 | 340000 | 1 1 | 340000 | 1 (33 rows)
medium_orders表
select * from medium_orders;
返回结果如下(与第三步查询结果相同时),则表示语句执行成功:
order_id | customer_id | order_total ----------+-------------+------------- 1 | 110000 | 1 1 | 120000 | 1 1 | 130000 | 1 1 | 140000 | 1 1 | 140000 | 1 (5 rows)
large_orders表
select * from large_orders;
返回结果如下(与第三步查询结果相同时),则表示语句执行成功:
order_id | customer_id | order_total ----------+-------------+------------- 1 | 210000 | 1 1 | 220000 | 1 1 | 340000 | 1 (3 rows)
special_orders表
select * from special_orders;
返回结果如下(与第三步查询结果相同时),则表示语句执行成功:
order_id | customer_id | order_total | other ----------+-------------+-------------+------- (0 rows)
示例2: 使用insert all向不同的表批量指定字段插入数据。
1、创建测试表1、表2。
create table test1
(id int,
sign_in date,
name varchar2(128),
last_id int,
last_name varchar2(128)
);
create table test2
(id int,
sign_in date,
name varchar2(128),
last_id int,
last_name varchar2(128)
);
2、指定字段批量插入数据。
INSERT ALL INTO test1 as TODO (id,sign_in,name,last_id,last_name)
VALUES (1,sysdate,'a',3,'c')
INTO test1 (id,sign_in,name)
VALUES (2,sysdate,'b')
INTO test2 (id,sign_in,name)
VALUES (1,sysdate,'a')
INTO test2 (id,sign_in,name,last_id,last_name)
VALUES (1,sysdate,'a',2,'b')
select 1 from dual;
3、查看插入数据结果。
select * from test1;
select * from test2;
显示结果为:
id | sign_in | name | last_id | last_name
----+---------------+------+---------+-----------
1 | 2022-10-14 14:23:31 | a | 3 | c
2 | 2022-10-14 14:23:31 | b | |
(2 rows)
id | sign_in | name | last_id | last_name
----+---------------+------+---------+-----------
1 | 2022-10-14 14:23:31 | a | |
1 | 2022-10-14 14:23:31 | a | 2 | b
(2 rows)
INSERT支持别名
功能描述
支持在INSERT语句中对表名使用别名。其它关于INSERT的用法请参考INSERT语法。
语法格式
INSERT INTO table_name t1(t1.col1,t1.col2);
参数说明
table_name
表名。
t1
表的别名。
col1
表的列1。
col2
表的列2。
注意事项
无。
示例
1、创建测试表并插入数据。
create table table1 (col1 int,col2 int);
create table table2 (col1 int,col2 int);
insert into table2 values(1,2);
insert into table2 values(2,3);
insert into table1 t1(t1.col1,t1.col2) select t2.col1,t2.col2 from table2 t2;
2、查询测试表table1。
select * from table1;
返回结果如下:
col1 | col2
------+------
1 | 2
2 | 3
(2 rows)
INSERT INTO NOLOGGING
功能描述
INSERT INTO NOLOGGING语句允许用户向表中添加一行或多行数据。
语法格式
INSERT INTO table_name [ { NOLOGGING | LOGGING } ]
{ DEFAULT VALUES | VALUES | VALUE {( { expression | DEFAULT } [, ...] ) }[, ...] | query };
参数说明
table_name
表名。
DEFAULT
对应字段名的缺省值。如果没有缺省值,则为NULL。
expression
赋予对应column的一个有效表达式或值。
query
一个查询语句(SELECT语句),将查询结果作为插入的数据。
注意事项
目前仅实现了语法层面支持INSERT INTO添加NOLOGGING关键字,实际执行逻辑等同于INSERT INTO。
该功能仅在数据库兼容模式为Oracle时支持(即数据库实例初始化时指定DBCOMPATIBILITY='A')。
示例
1、创建测试表。
create table tb1_1192391
(
a1 int,
a2 int,
a3 int
);
2、创建存储过程。
create or replace procedure proc1_1192391(var1 int,var2 in int,n1 out int,n2 out int,n3 out int)
as
PRAGMA AUTONOMOUS_TRANSACTION;
begin
INSERT INTO tb1_1192391 NOLOGGING VALUES(var1,var1+10,var1+20);
insert into tb1_1192391 NOLOGGING(a1,a2,a3) values(var2,var2+1,var2+2);
select a1,a2,a3 from tb1_1192391 order by a1,a2,a3 limit 1 into n1,n2,n3;
end ;
/
3、调用存储过程。
select proc1_1192391(10,20);
返回结果如下:
proc1_1192391
---------------
(10,20,30)
(1 row)
4、查询表数据。
select * from tb1_1192391 order by 1,2,3;
返回结果如下,则表示插入数据成功:
a1 | a2 | a3
----+----+----
10 | 20 | 30
20 | 21 | 22
(2 rows)