暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

华为GaussDB T CREATE TABLE

墨天轮 2019-10-12
2001

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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论