金仓数据库KingbaseES CREATE TABLE AS命令介绍
关键字:
KingbaseES、CREATE命令、人大金仓、KingbaseES
CREAT TABLE AS语句介绍
CREATE TABLE AS语句可以使用查询的结果创建和填充表。由于CREATE TABLE AS是一个单独的建表和填充表命令。所以用户只能看到SELECT语句填充后的结果。在KingbaseES也支持了CREATE TABLE AS语句,其主要语法如下:
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name [ (column_name [, ...] ) ] [ partition_by_clause ] [ USING method ] [ WITH ( storage_parameter [= value] [, ...] ) | WITHOUT OIDS ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ TABLESPACE tablespace_name ] AS query [ WITH [ NO ] DATA ] |
CREATE TABLE AS的使用
在KingbaseES中使用CREATE TBALE AS建表时只能指定列名,无法在建表的列上指定约束(例如 not null等)和列的类型。
- 使用CREATE TABLE AS命令时,只能指定列名。
--创建表并插入相关数据,供CREATE TABLE AS命令执行 CREATE TABLE source_table(id int unique, name text); INSERT into source_table values(1,'TOM'),(2,'john'); --CREATE TABLE AS命令使用unique关键字将无法创建表 CREATE TABLE as_table(id unique, name) as SELECT * from source_table; -- CREATE TABLE AS命令指定列类型,同样无法创建表 CREATE TABLE as_table(id int, name) as SELECT * from source_table; --只指定列名将创建成功 CREATE TABLE as_table(id, name) as SELECT * from source_table; --表中已经保存了select 语句的查询结果 SELECT * from as_table; |
- KingbaseES也支持使用with no data,只保存select语句结构,不插入数据的建表语句。
--使用CREATE TABLE AS 命令创建目标表 CREATE TABLE as_no_data(id, name)as SELECT * from source_table with no data; --表中并不存在数据 Select * from as_no_data; |
- CREATE TABLE AS 也可以建立分区表
--创建分区表 CREATE TABLE as_partition_table ( ID, NAME ) PARTITION BY list ( ID ) ( PARTITION p1 VALUES ( 1 ), PARTITION p2 VALUES ( 2 ) ) AS SELECT * FROM source_table WITH NO DATA; --查看表结构,发现表as_partition_table拥有分区p1和p2 \d+ as_partition_table |
- CREATE TABLE AS 也可以建立临时表
--建立临时表,使临时表在commit时被drop begin; CREATE TEMP table as_temp_table (id, name) ON COMMIT DROP as SELECT * from source_table with no data; --查看表结构 \d+ as_temp_table --commit后表不存在 Commit; \d+ as_temp_table |
- CREATE TABLE AS中可以省略列名
--使用CREATE TABLE AS创建表 CREATE table as_table_1 as SELECT * from source_table with no data; |
- CREATE TABLE AS中可以使用复杂的select语法
--在CREATE TABLE AS中使用group by CREATE table as_group as SELECT count(*) from source_table GROUP BY id with no data; --查看表结构 \d as_group --在CREATE TABLE AS中使用where子句 CREATE TABLE as_where as SELECT count(*) from source_table where id=1; --查看表中数据 Select * from as_where; --在CREATE TABLE AS中使用having子句 CREATE table as_having as SELECT count(*) from source_table GROUP BY id HAVING count(id)>1 with no data; --查看表结构 \d as_having --在CREATE TABLE AS中使用limit子句 CREATE table as_limit as SELECT count(*) from source_table LIMIT 1 with no data; --查看表结构 \d as_limit --在CREATE TABLE AS中使用连接 CREATE table as_join as SELECT as_partition_table.id , source_table.name from source_table LEFT JOIN as_partition_table on as_partition_table.id = source_table.id LIMIT 1 with no data; --查看表结构 \d as_join --在CREATE TABLE AS中使用锁定子句 CREATE table as_lock as SELECT * from source_table LIMIT 1 FOR SHARE NOWAIT with no data; --查看表结构 \d as_lock |
总结
通过上述的使用介绍,我们可以发现在CREATE TABLE AS语句中无法指定列的类型和约束。在使用CREATE TABLE AS语句时,我们可以指定选择是否复制select语句中的数据。