语法格式
INSERT [INTO] [database_name.]table_name [(col_name,...)]
VALUES ({expr | DEFAULT},...),(...),...
或
INSERT [INTO] [database_name.]table_name
[PARTITION (partition_name)] [(col_name,...)]
SELECT ... FROM [database_name.]table_name ...
说明
INSERT 将新行插入到一个已存在的表中。INSERT...VALUES 形式的语句基于明确
的值插入记录行。INSERT ... SELECT 形式的语句从另一个或多个表中选取出值,
GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 689
并将其插入。
参数说明
table_name:是要被插入数据的表。
col_name:指出语句指定的值赋给哪个列。
PARTITION:只能用于跨引擎分区表,将数据插入到,分区表中分区名为
partition_name 的分区中,需要注意的是,partition_name 中有最新分区以外的
其他分区,语句将会报错。
如果在INSERT...VALUES 或INSERT...SELECT 中没有指定column 列,
那么所
有列的值必须在VALUES()列表中或由SELECT 提供。如果用户不知道表的列
的次序,可以使用DESC table_name 来查看。
使用关键词DEFAULT,明确地把列设置为默认值。这样,编写向所有列赋值
的INSERT 语句时可以更容易,
因为使用DEFAULT 可以避免编写出不完整的、
未包含全部列值的VALUES 清单。如果不使用DEFAULT,用户必须注明每一
个列的名称,与VALUES 中的每个值对应。
可以使用DEFAULT (col_name)作为设置列默认值的一个更通用的形式。
如果column 列表和VALUES 列表都为空,INSERT 将创建一个行,它的每一
列都设置为它的默认值。
可以指定一个表达式expr 来提供列值。例如,插入一个INT 型的数据表达式
可以写为INSERT INTO t(a) VALUES(3+5);
示例
示例1:INSERT INTO...
gbase> CREATE TABLE t0(id int) REPLICATED;
Query OK, 0 rows affected
gbase> INSERT INTO t0 VALUES(1),(2),(3),(4),(5),(6),(2),(3),(1);
Query OK, 9 rows affected
Records: 9 Duplicates: 0 Warnings: 0
gbase> SELECT * FROM t0;
+------+
| id |
+------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 690
| 6 |
| 2 |
| 3 |
| 1 |
+------+
9 rows in set
示例2:INSERT INTO...SELECT...
gbase> CREATE TABLE t0(id int) REPLICATED;
Query OK, 0 rows affected
gbase>
INSERT
INTO
t0(id)
SELECT
DISTINCT
lo_custkey
FROM
ssbm.lineorder
LIMIT
15;
Query OK, 15 rows affected
Records: 15 Duplicates: 0 Warnings: 0
gbase> SELECT * FROM t0;
+-------+
| id |
+-------+
| 25738 |
| 18238 |
| 20612 |
| 5393 |
| 5954 |
| 11728 |
| 17302 |
| 14578 |
| 2210 |
| 27362 |
| 1642 |
| 29255 |
| 10745 |
| 7180 |
| 16276 |
+-------+
15 rows in set
示例3:INSERT INTO ... VALUES(DEFAULT)
gbase> CREATE TABLE t0(id int DEFAULT 1) REPLICATED;
Query OK, 0 rows affected
gbase> INSERT INTO t0 (id) VALUES(DEFAULT);
Query OK, 1 row affected
-- 也可以这样指定默认值进行插入
GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 691
gbase> INSERT INTO t0 (id) VALUES(DEFAULT(id));
Query OK, 1 row affected
gbase> SELECT * FROM t0;
+------+
| id |
+------+
| 1 |
| 1 |
+------+
2 rows in set
示例4:INSERT 时,自动更新TIMESTAMP 列。
示例中用到的表如下:
DROP TABLE IF EXISTS t1;
CREATE TABLE t1(a timestamp , b int) DISTRIBUTED BY ('b');
gbase> INSERT INTO t1(b) VALUES(1);
Query OK, 1 row affected
gbase> INSERT INTO t1(b) VALUES (2);
Query OK, 1 row affected
gbase> INSERT INTO t1(b) VALUES (3);
Query OK, 1 row affected
gbase> INSERT INTO t1(b) VALUES (4);
Query OK, 1 row affected
gbase> INSERT INTO t1(b) VALUES (5);
Query OK, 1 row affected
gbase> SELECT * FROM t1 ORDER BY a;
+---------------------+------+
| a | b |
+---------------------+------+
| 2013-12-17 14:04:43 | 1 |
| 2013-12-17 14:04:47 | 2 |
| 2013-12-17 14:04:52 | 3 |
| 2013-12-17 14:04:59 | 4 |
| 2013-12-17 14:05:04 | 5 |
+---------------------+------+
5 rows in set
使用INSERT INTO t1 VALUES(),()语法时,此时INSERT 完成后数据行对应的
GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 692
TIMESTAMP 列的值自动更新为一个时间戳。
gbase> INSERT INTO t1(b) VALUES (6),(7);
Query OK, 1 row affected
b=6 和b=7 对应的TIMESTAMP 列自动更新为一个时间戳。
gbase> SELECT * FROM t1 ORDER BY a;
+---------------------+------+
| a | b |
+---------------------+------+
| 2013-12-17 15:44:29 | 1 |
| 2013-12-17 15:44:30 | 2 |
| 2013-12-17 15:44:31 | 3 |
| 2013-12-17 15:44:32 | 4 |
| 2013-12-17 15:44:33 | 5 |
| 2013-12-17 15:44:48 | 7 |
| 2013-12-17 15:44:48 | 6 |
+---------------------+------+
7 rows in set
注意
INSERT ... SELECT 形式的语句,类型边界值仍以各引擎为准。