#CREATE TABLE AS

# 通用描述

CREATE TABLE AS语句根据一个子查询结果创建一张新的表对象,包括列字段及其类型,同时插入查询结果包含的数据集。

创建的表的列字段与子查询的列项具有相同的名称和类型,但列字段名称可以通过指定语句重置,类型则不可改变。同时还可以指定表的如下属性:

  • 列约束
  • 存储参数
  • 分区(不能为临时表创建分区)
  • 表空间

# 语句定义

create table as::=

syntax
CREATE GLOBAL PRIVATE TEMPORARY TABLE schema . table_name column_clause table_properties AS subquery

column_clause::=

syntax
( out_of_line_constraint column_name DEFAULT default_expr inline_constraint , )

# global|private temporary

该语句用于指定创建的表为临时表,语法同CREATE TABLE中描述。

# table_name

该语句用于指定创建的表的名称,语法同CREATE TABLE中描述。

# out_of_line_constraint

该语句用于定义表的行外约束项,语法同CREATE TABLE中描述。

# column_name

该语句用于重置表的列字段名称,不定义此项时,默认按子查询结果的所有列项及类型创建表的各项列字段及类型;定义此项时,则必须与子查询结果的列项一一对应,且名称符合YashanDB的对象命名规范

# default default_expr

定义列字段的缺省值,可省略,default_expr可以为字面量|运算式|函数等表达式。

# inline_constraint

为列字段定义行内约束项,语法同CREATE TABLE中描述。

# table_properties

该语句用于指定表的存储、分区、表空间等属性,语法同CREATE TABLE中描述。

# subquery

分布式部署中,不允许子查询语句包含分布式系统视图,否则返回错误。

语法同SELECT中描述。

示例

--1、复制表的所有列及数据到新表,包括列字段名称、列字段类型和表数据,不包括约束项、存储参数、分区、表空间
CREATE TABLE branches_copy_all AS SELECT * FROM branches;
--添加false条件可以只复制表结构而不复制数据
CREATE TABLE branches_copy_no_data AS SELECT * FROM branches WHERE 1=2;
  
--2、复制表的部分列,重置列字段名称,并定义行内约束,此时列字段必须与子查询列项一一对应
CREATE TABLE branches_copy_column(branch_no1 PRIMARY KEY,branch_name) AS SELECT branch_no,branch_name bname FROM branches;
  
--3、复制表,并定义行外约束和表空间
CREATE TABLE branches_copy_add(FOREIGN KEY (area) REFERENCES area(area_no)) TABLESPACE yashan
AS SELECT branch_no,branch_name,area_no area FROM branches;