CREATE TABLE
功能描述
创建表。
注意事项
- 如果是创建当前用户的表,用户需要被授予CREATE TABLE系统权限;如果是创建其他用户的表,用户需要被授予CREATE ANY TABLE系统权限,普通用户不可以创建系统用户对象。
- 需要足够的存储空间。
- 必须指定:表名、列名(数据类型、size)。
- 自增列只支持int和bigint类型,一个表只支持一个自增列,并且自增列必须是主键或者唯一索引。
- 字符集和row_movement_clause目前只支持SQL解析。
- 创建外键时,如果不指定列,默认取父表的主键。如果父表无主键,则报错。
- 临时表中若包含BLOB字段,则该字段被定义为RAW(8000);若包含CLOB字段,则被定义为VARCHAR(8000 BYTE)。
- 本地临时表,只支持ON COMMIT PRESERVE ROWS,表名必须以‘#’字符开头,并且设置配置项LOCAL_TEMPORARY_TABLE_ENABLED=TRUE,激活本地临时表特性。
- 全局临时表,支持事务级别临时表和会话级别临时表。
- ON COMMIT PRESERVE ROWS:定义会话级别临时表,当该会话结束时,临时表的数据将随着会话的结束而删除,但表结构仍然存在。
- ON COMMIT DELETE ROWS:定义事务级别临时表,当事务结束,临时表的数据将随着事务结束而删除,表结构仍然存在。
- 如果不指定ON COMMIT { DELETE | PRESERVE } ROWS子句,默认创建事务级别临时表。
语法格式
[ ON COMMIT { DELETE | PRESERVE } ROWS ] 仅支持在临时表中使用。
TABLESPACE tablespace_name不支持在临时表中使用。
CREATE [[ GLOBAL ] TEMPORARY ] TABLE [ IF NOT EXISTS ][ schema_name.] table_name { relational_properties | [ ( column_name [ DEFAULT expr [ ON UPDATE expr ] ] [ AUTO_INCREMENT ] [COMMENT 'string'] [COLLATE collation_name] [inline_constraint] | out_of_line_constraint ) ] AS query } [ ON COMMIT { DELETE | PRESERVE } ROWS ] [ physical_properties ] [ TABLESPACE tablespace_name ] [ table_properties ] [ CRMODE { PAGE | ROW } ] [ NOLOGGING]
- relational_properties 子句:
AUTO_INCREMENT和DEFAULT不能同时使用。( {column_name datatype_name [ DEFAULT expr [ ON UPDATE expr ] ] [ AUTO_INCREMENT ] [ COMMENT 'string' ] [ COLLATE collation_name ] [ inline_constraint ]} [, ... ] )
- inline_constraint 子句:
临时表不能使用references_clause 子句。
PRIMARY KEY和UNIQUE不能同时使用。
[ CONSTRAINT constraint_name ] { [ NOT ] NULL | UNIQUE | PRIMARY KEY | CHECK( expr ) | references_clause }[...]
- references_clause 子句:
REFERENCES [ schema_name. ]object_table [( column_name )] [ON DELETE { CASCADE | SET NULL } ]
- out_of_line_constraint 子句:
[ CONSTRAINT constraint_name ] { UNIQUE( column_name [ , ... ] ) [ using_index_clause ] | PRIMARY KEY( column_name [ , ... ] ) [ using_index_clause ] | CHECK( expr ) | FOREIGN KEY( column_name [ , ... ] ) references_clause_ex }[ ,...]
- using_index_clause 子句:
USING INDEX [ INITRANS integer | TABLESPACE tablespace_name | LOCAL [ ( { PARTITION partition_name [ TABLESPACE tablespace_name | INITRANS integer | PCTFREE integer ] } [ , ... ] ) ] ] [ ...]
- references_clause_ex 子句:
REFERENCES [ schema_name. ]object_table_name [( column_name [ , ... ] )] [ ON DELETE { CASCADE | SET NULL } ]
- AS query子句:
SELECT [SQL_CALC_FOUND_ROWS] [ DISTINCT ] expression [ [ AS ] name ] [ , ... ] [ FROM table_reference [ [AS] alias ] [ , ... ] ] [ WHERE { condition | [ NOT ] EXISTS ( correlated subquery ) } ] [ [START WITH condition ] CONNECT BY [ NOCYCLE ] [ PRIOR ] condition ] [ GROUP BY { column_name | number } [ , ... ] ] [ HAVING condition [ , ... ] ] [ { UNION [ ALL ] } select ] [ ORDER BY { column_name | number } [ ASC | DESC ] [ NULLS FIRST | NULLS LAST ] [ , ... ] ] [ LIMIT [ offset_expr, ] count_expr | LIMIT count_expr OFFSET offset_expr | OFFSET offset_expr [ LIMIT count_expr ] ]
- physical_properties 子句:
{ segment_attributes_clause }
- segment_attributes_clause 子句:
TABLESPACE tablespace_name不支持在临时表中使用。
{ physical_attributes_clause | TABLESPACE tablespace_name } [ ... ]
- physical_attributes_clause 子句:
{ PCTFREE integer | INITRANS integer | MAXTRANS integer } [ ...]
- table_properties 子句:
[ column_properties ] [ AUTO_INCREMENT [ = ] value ] [ AS subquery]
- column_properties 子句:
[ LOB_storage_clause ] [ APPENDONLY { ON | OFF } ]
- LOB_storage_clause 子句:
LOB ( LOB_item ) STORE AS { [ ( LOB_parameters ) ] }
- LOB_parameters 子句:
[ TABLESPACE tablespace_name | { ENABLE | DISABLE } STORAGE IN ROW ][ ... ]
参数说明
- GLOBAL
创建全局表。
- TEMPORARY
创建临时表。
- IF NOT EXISTS
创建表时,如果表已经存在,则不做改动直接返回;如果表不存在,则创建新表。
- [schema_name.]table_name
表名,不能和用户下表重名。本地临时表的名字需要用字符“#”开头。创建本地临时表时,不使用GLOBAL参数,且需要将参数LOCAL_TEMPORARY_TABLE_ENABLED的值设为TRUE。
- relational_properties
表属性,包括列名、类型、行内约束和行外约束。
- DEFAULT expr [ON UPDATE expr]
列默认值支持表达式,在创建DDL时,如果DEFAULT是常量表达式会向列类型做兼容检查。
- [on update expr] 是兼容语法,UPDATE行数据,不指定该列,取update默认值填充。
- insert和update default expr最大长度为1024英文字符长度,default后面的文本超过最大长度将会报错“GS-00611, default value string is too long, exceed 1024.”。
- AUTO_INCREMENT
指定自增列。
- 如果把一个NULL插入到一个AUTO_INCREMENT数据列里去,GaussDB 100将自动生成下一个序列编号。编号从1开始,并1为基数递增。
- 把0插入AUTO_INCREMENT数据列的效果与插入NULL值一样。但不建议这样做,还是以插入NULL值为好。
- 当插入记录时,没有为AUTO_INCREMENT明确指定值,则等同插入NULL值。
- 当插入记录时,如果为AUTO_INCREMENT数据列明确指定了一个数值,则会出现两种情况。
- 情况一,如果插入的值与已有的编号重复,则会出现报错信息,因为AUTO_INCREMENT数据列的值必须是唯一的。
- 情况二,如果插入的值大于已编号的值,则会把该插入到数据列中,并使在下一个编号将从这个新值开始递增。也就是说,可以跳过一些编号。
- 如果用UPDATE命令更新自增列,如果列值与已有的值重复,则会出错。如果大于已有值,则下一个编号从该值开始递增。
- 自增列增长到0x7FFFFFFFFFFFFFFF,为防止出现溢出,自增值一直为0x7FFFFFFFFFFFFFFF。
- COMMENT 'string'
指定列的注释,通过USER_COL_COMMENTS系统视图查看。
- COLLATE collation_name
定义排序的规则。排序规则就是当比较两个列的数据时,根据某种规则来确定哪个比较大,是否相等。
collation_name取值如下:
- UTF8_BIN:适用UTF8字符集,将所有字符看作二进制串,然后从最高位往最低位比对。区分大小写。
- UTF8_GENERAL_CI:适用UTF8字符集,不区分大小写。
- UTF8_UNICODE_CI:适用UTF8字符集,不区分大小写。
- GBK_BIN:适用GBK字符集,区分大小写。
- GBK_CHINESE_CI:适用GBK字符集,不区分大小写。
- inline_constraint
列约束,作为列定义的一部分,现支持[NOT] NULL、UNIQUE、PRIMARY KEY、唯一索引、外键、check约束。
- out_of_line_constraint
表约束,单独一行,支持UNIQUE索引、PRIMARY KEY、外键、CHECK约束。
- [ NOT ] NULL
是否允许该列值为空。
- NOT NULL:不允许该列值为空。
- NULL:允许该列值为空。
- UNIQUE
值唯一,允许为空,一个表可以多个列为UNIQUE。
- PRIMARY KEY
主键,建立索引,不能为空,一个表只能建立一个主键。
- CHECK( expr )
对列值校验。若列插入数据为NULL,则默认校验为TRUE。
- ON DELETE { CASCADE | SET NULL }
该属性用于外键,参照外表发生删除时,本表级联变化。
- CASCADE
本表删除。
- SET NULL
本表设置为NULL。
- FOREIGN KEY
外键。
- INITRANS integer
事务表的初始大小。
- TABLESPACE tablespace_name
指定表空间。
- LOCAL
默认属性,创建本地索引。
- PARTITION partition_name
分区表。
- SQL_CALC_FOUND_ROWS
在查询语句中,获取总行数,等效于select count(*) from,适用于分页程序查询。
- DISTINCT
去重复,支持单列去重或者多列联合去重复。
- [ AS ] name
设置输出打印列别名。
- FROM table_reference [ [AS] alias ] [ , ... ]
查询表。
- table_reference
查询的父表,若该表是包含LOB字段的临时表,则不允许使用行内行外存储语法。
- [AS] alias
为方便联合查询,可以对表设置别名。
- WHERE { condition | [ NOT ] EXISTS ( correlated subquery )
条件表达式,对行进行筛选。
correlated subquery
相关子查询语句。
- START WITH condition CONNECT BY [ NOCYCLE ] [ PRIOR ] condition
树形表数据的子查询语句。如果一个表包含树形结构的数据,可以使用本查询子句进行查询。
- START WITH
遍历的起始条件,指定查询开始的数据行。
- CONNECT BY
连接条件,用于指定父数据行和子数据行之间的关系,结合prior使用。
- NOCYCLE
即使数据中存在CONNECT BY LOOP,NOCYCLE参数也会指示数据库从查询中返回行。
- PRIOR
prior是一个一元操作符,和+、-符号具有相同优先级。prior放在等号的左边或者右边决定了检索是自下向上还是自上向下的。换句话说:prior跟父节点列parentid放在一起,就是往父结点方向遍历;prior跟子结点列subid放在一起,则往叶子结点方向遍历。
- GROUP BY { column_name | number } [ , ... ]
根据属性进行分组,需要注意的是会先排序后分组。
- column_name
分组的属性列名称。
- number
分组的属性列在表中的序号。
- HAVING condition [ , ... ]
用来过滤由GROUP BY语句返回的记录集,condition指定了过滤的条件。
- { UNION [ ALL ] } select
UNION操作符用于合并两个或多个SELECT语句的结果集。如果不含ALL关键字,则会消去表中任何重复行。
ALL
含ALL关键字,不会消去表中任何重复行。
- ORDER BY { column_name | number } [ ASC | DESC ] [ NULLS FIRST | NULLS LAST ] [ , ... ]
排序条件,根据column_name| number排序。若不指定 [ NULLS FIRST | NULLS LAST ]选项,ASC默认为NULLS LAST, DESC默认为NULLS FIRST。
- column_name
排序的列名称。
- number
排序的列序号。
- ASC
升序排序。
- DESC
降序排序。
- NULLS FIRST
指定ORDER BY列中NULL值的排序位置, 该选项表示将包含NULL值的行排在最前面。
- NULLS LAST
指定ORDER BY列中NULL值的排序位置,该选项表示将包含NULL值的行排在最后面。
- LIMIT [ offset_expr, ] count_expr | LIMIT count_expr OFFSET offset_expr | OFFSET offset_expr [ LIMIT count_expr ]
count和offset用于查询结果集的子集数据的限制条件。
- offset_expr
数据结果集起始位置的值。例如一个查询结果有100条,offset_expr=10则从第10条开始返回。
- count_expr
需要返回结果集中的数据量,比如一个查询结果有100条,count_expr=40则表示选取40条返回。
- OFFSET
关键字,标识数据起始位置。
- PCTFREE integer
为一个块保留的空间百分比。当数据块的可用空间低于该空间百分比时,只能更新该数据块的数据,不能向该数据块插入新数据。取值范围是[8,80],默认值是8。
- INITRANS
初始化数据块中事务槽的个数。
- MAXTRANS
数据块中事务槽的最大值。
- table_properties
指定表属性。
- AUTO_INCREMENT [ = ] value
建表时可用“AUTO_INCREMENT=n”选项来指定一个自增的初始值。
不指定从1开始,指定从value开始。
- APPENDONLY { ON | OFF }
- APPENDONLY ON表示不同的线程在对同一张表插入时,会申请新的page做插入,而不会去使用未插满的page。这种情况下,页面锁等待时长减少,但page空间浪费较多。
- APPENDONLY OFF表示不同的线程在对同一张表插入时,会尽量插满page空间。这种情况下,等锁时间比较长。
不指定时,默认为OFF。
- AS subquery
指定子查询,在创建表时将子查询返回的行插入到表中。
- LOB_storage_clause
- LOB ( LOB_item ) STORE AS { [ ( LOB_parameters ) ]
指定lob字段单独segment储存,可以指定线行内存储和行外存储。目前存储层只支持行外存储。
- LOB_item
lob字段名称。
- LOB_parameters
lob字段存储参数。
{ENABLE | DISABLE } STORAGE IN ROW
行内存储和行外存储。
- ENABLE
行内存储。
- DISABLE
行外存储。
- CRMODE { PAGE | ROW }
指定该表的CR_MODE,不指定时默认取当前实例的CR_MODE配置。
- CRMODE PAGE指定为页级MVCC模式。
- CRMODE ROW指定为行级MVCC模式。
- NOLOGGING
此关键字指定表为nologging table。nologging table与普通表的区别主要是不记录redo日志,由于日志量的减少,所以提高了性能,同时,由于没有redo日志,重启后无法重演恢复。适用于存放临时数据的场景。
- nologging table表数据不做恢复,数据库重启时,表定义保留,表数据清空。
- nologging table不支持flashback & recycle bin,不支持两阶段提交。
- nologging table的表定义支持主备复制,表数据不做主备复制。
- nologging table的表定义支持备份恢复,表数据不做备份。
- nologging table支持MVCC,支持rollback,支持普通表所支持的DDL和DML操作。
- nologging table只能放到nologging tablespace上。
- nologging table默认放到temp2,可指定nologging tablespace,nologging table的index同理。
- create table不指定nologging关键字,但是放到nologging tablespace上,就是nologging table。
- nologging分区表的所有分区,都必须在nologging tablespace上。
- 在dba_tables视图中,nologging table的table_type显示为NOLOGGING。
示例
- 创建全局会话级临时表sections。
--删除表sections。 DROP TABLE IF EXISTS sections;
--创建表sections。 CREATE GLOBAL TEMPORARY TABLE sections ( section_id NUMBER(4) not null, section_name VARCHAR2(30), manager_id NUMBER(6), place_id NUMBER(4) ) ON COMMIT PRESERVE ROWS;
--插入数据1。 insert into sections (section_id, section_name, manager_id, place_id) values (10, 'Administration', 200, 1700); --插入数据2。 insert into sections (section_id, section_name, manager_id, place_id) values (20, 'Marketing', 201, 1800); --插入数据3。 insert into sections (section_id, section_name, manager_id, place_id) values (30, 'Purchasing', 114, 1700); --提交事务。 COMMIT;
--去重显示place_id。 SELECT DISTINCT place_id FROM sections;
- 创建表education。
--删除表education。 DROP TABLE IF EXISTS education;
--创建表education。 CREATE TABLE education(staff_id INT, higest_degree CHAR(8) NOT NULL, graduate_school VARCHAR(64), graduate_date DATETIME, education_note VARCHAR(70));
- 创建表training。
--删除表training。 DROP TABLE IF EXISTS training;
--创建表training。 CREATE TABLE training ( staff_id INT NOT NULL, course_name VARCHAR(50), course_start_date DATETIME, course_end_date DATETIME, exam_date DATETIME, score INT );
- 创建表privilege。
--删除表privilege。 DROP TABLE IF EXISTS privilege;
--创建privilege。 CREATE TABLE privilege(staff_id INT PRIMARY KEY, privilege_name VARCHAR(64) NOT NULL, privilege_description VARCHAR(64), privilege_approver VARCHAR(10));
- 创建包含BLOB字段和CLOB的临时表,被定义为RAW(8000)和VARCHAR(8000)。
--删除表STAFFS。 CREATE GLOBAL TEMPORARY TABLE STAFFS ( staff_id INT NOT NULL, course_name BLOB, COMMENT CLOB );
--查看STAFFS表。 DESC STAFFS; Name Null? Type ----------------------------------- -------- ------------------------------------ STAFF_ID NOT NULL BINARY_INTEGER COURSE_NAME RAW(8000) COMMENT VARCHAR(8000 BYTE)
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」关注作者【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。评论