文档中心MogDBMogDB StackUqbar
v5.0

文档:v5.0

CREATE TABLE

功能描述

在当前数据库中创建一个新的空白表,该表由命令执行者所有。

注意事项

  • 列存表支持的数据类型请参考列存表支持的数据类型
  • 列存表不支持数组。
  • 列存表不支持生成列。
  • 列存表不支持创建全局临时表。
  • 创建列存表的数量建议不超过1000个。
  • 如果在建表过程中数据库系统发生故障,系统恢复后可能无法自动清除之前已创建的、大小为0的磁盘文件。此种情况出现概率小,不影响数据库系统的正常运行。
  • 列存表的表级约束只支持PARTIAL CLUSTER KEY、UNIQUE、PRIAMRY KEY,不支持外键等表级约束。
  • 列存表的字段约束只支持NULL、NOT NULL、DEFAULT常量值、UNIQUE和PRIMARY KEY。
  • 列存表支持delta表,受参数enable_delta_store控制是否开启,受参数deltarow_threshold控制进入delta表的阀值。
  • 使用JDBC时,支持通过PrepareStatement对DEFAULT值进行参数化设置。
  • 每张表的列数最大为1600,具体取决于列的类型,所有列的大小加起来不能超过8192 byte(由于数据存储形式原因,实际上限略小于8192 byte),text、varchar、char等长度可变的类型除外。
  • 被授予CREATE ANY TABLE权限的用户,可以在public模式和用户模式下创建表。如果想要创建包含serial类型列的表,还需要授予CREATE ANY SEQUENCE创建序列的权限。
  • 不可与同一模式下已存在的synonym产生命名冲突。
  • 仅支持在B兼容性数据库下指定COMMENT和可见性VISIBLE\INVISIBLE。

语法格式

创建表。

CreateTable ::= CREATE [ [ GLOBAL | LOCAL ] [ TEMPORARY | TEMP ] | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name 
    ({ column_name data_type [ CHARACTER SET | CHARSET charset ] [ compress_mode ] [ COLLATE collation ] [ column_constraint [ ... ] ]
        | table_constraint
        | LIKE source_table [ like_option [...] ] }
        [, ... ])
    [ AUTO_INCREMENT [ = ] value ]
    [ [DEFAULT] CHARACTER SET | CHARSET [ = ] default_charset ] [ [DEFAULT] COLLATE [ = ] default_collation ]
    [ WITH ( {storage_parameter = value} [, ... ] ) ]
    [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
    [ COMPRESS | NOCOMPRESS ]
    [ TABLESPACE tablespace_name ]
    [ COMMENT =? 'text' ];
  • 其中列约束column_constraint为:

    column_constraint ::= [ CONSTRAINT constraint_name ]
    { NOT NULL |
      NULL |
      CHECK ( expression ) |
      DEFAULT default_expr |
      GENERATED ALWAYS AS ( generation_expr ) [STORED] |
      AUTO_INCREMENT |
      ON UPDATE update_expr |
      UNIQUE [KEY] index_parameters |
      ENCRYPTED WITH ( COLUMN_ENCRYPTION_KEY = column_encryption_key , ENCRYPTION_TYPE = encryption_type_value ) |
      PRIMARY KEY index_parameters |
      REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
          [ ON DELETE action ] [ ON UPDATE action ] }
    [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
    [ COMMENT =? 'text' ]
  • 其中列的压缩可选项compress_mode为:

    compress_mode ::= { DELTA | PREFIX | DICTIONARY | NUMSTR | NOCOMPRESS }
  • 其中表约束table_constraint为:

    table_constraint ::= [ CONSTRAINT [ constraint_name ] ]
    { CHECK ( expression ) |
      UNIQUE [ index_name ][ USING method ] ( { { column_name | ( expression ) } [ ASC | DESC ] } [, ... ] ) index_parameters [ VISIBLE | INVISIBLE ] |
      PRIMARY KEY [ USING method ] ( { column_name [ ASC | DESC ] } [, ... ] ) index_parameters [ VISIBLE | INVISIBLE ] |
      FOREIGN KEY [ index_name ] ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]
          [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] |
      PARTIAL CLUSTER KEY ( column_name [, ... ] ) }
    [ DEFERRABLE | NOT DEFERRABLE | INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
    [ COMMENT =? 'text' ]
  • 其中like选项like_option为:

    like_option ::= { INCLUDING | EXCLUDING } { DEFAULTS | GENERATED | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | PARTITION | RELOPTIONS | ALL }
  • 其中索引参数index_parameters为:

    index_parameters ::= [ WITH ( {storage_parameter = value} [, ... ] ) ]
    [ USING INDEX TABLESPACE tablespace_name ]

参数说明

  • UNLOGGED

    如果指定此关键字,则创建的表为非日志表。在非日志表中写入的数据不会被写入到预写日志中,这样就会比普通表快很多。但是非日志表在冲突、执行操作系统重启、数据库重启、主备切换、切断电源操作或异常关机后会被自动截断,会造成数据丢失的风险。非日志表中的内容也不会被复制到备服务器中。在非日志表中创建的索引也不会被自动记录。

    使用场景:非日志表不能保证数据的安全性,用户应该在确保数据已经做好备份的前提下使用,例如系统升级时进行数据的备份。

    故障处理:当异常关机等操作导致非日志表上的索引发生数据丢失时,用户应该对发生错误的索引进行重建。

  • GLOBAL | LOCAL

    创建临时表时可以在TEMP或TEMPORARY前指定GLOBAL或LOCAL关键字。如果指定GLOBAL关键字,MogDB会创建全局临时表,否则MogDB会创建本地临时表。

  • TEMPORARY | TEMP

    如果指定TEMP或TEMPORARY关键字,则创建的表为临时表。临时表分为全局临时表和本地临时表两种类型。创建临时表时如果指定GLOBAL关键字则为全局临时表,否则为本地临时表。

    全局临时表的元数据对所有会话可见,会话结束后元数据继续存在。会话与会话之间的用户数据、索引和统计信息相互隔离,每个会话只能看到和更改自己提交的数据。全局临时表有两种模式:一种是基于会话级别的(ON COMMIT PRESERVE ROWS),当会话结束时自动清空用户数据;一种是基于事务级别的(ON COMMIT DELETE ROWS),当执行commit或rollback时自动清空用户数据。建表时如果没有指定ON COMMIT选项,则缺省为会话级别。与本地临时表不同,全局临时表建表时可以指定非pg_temp_开头的schema。

    本地临时表只在当前会话可见,本会话结束后会自动删除。因此,在除当前会话连接的数据库节点故障时,仍然可以在当前会话上创建和使用临时表。由于临时表只在当前会话创建,对于涉及对临时表操作的DDL语句,会产生DDL失败的报错。因此,建议DDL语句中不要对临时表进行操作。TEMP和TEMPORARY等价。

    img 须知:

    • 本地临时表通过每个会话独立的以pg_temp开头的schema来保证只对当前会话可见,因此,不建议用户在日常操作中手动删除以pg_temp,pg_toast_temp开头的schema。
    • 如果建表时不指定TEMPORARY/TEMP关键字,而指定表的schema为当前会话的pg_temp_开头的schema,则此表会被创建为临时表。
    • ALTER/DROP全局临时表和索引,如果其它会话正在使用它,禁止操作(ALTER INDEX index_name REBUILD除外)。
    • 全局临时表的DDL只会影响当前会话的用户数据和索引。例如truncate、reindex、analyze只对当前会话有效。
    • 全局临时表功能可以通过设置GUC参数max_active_global_temporary_table控制是否启用。如果max_active_global_temporary_table=0,关闭全局临时表功能。
    • 临时表只对当前会话可见,因此不支持与\parallel on并行执行一起使用。
    • 临时表不支持主备切换。
    • 全局临时表不响应自动清理,在长链接场景使用时尽量使用on commit delete rows的全局临时表,或定期手动执行vacuum,否则可能导致clog日志不回收。
  • IF NOT EXISTS

    如果已经存在相同名称的表,不会报出错误,而会发出通知,告知通知此表已存在。

  • table_name

    要创建的表名。

    img须知

    物化视图的一些处理逻辑会通过表名的前缀来识别是不是物化视图日志表和物化视图关联表,因此,用户不要创建表名以mlog_或matviewmap_为前缀的表,否则会影响此表的一些功能。

  • column_name

    新表中要创建的字段名。

  • constraint_name

    建表时指定的约束名称。

    img 须知:在B模式数据库下(即sql_compatibility = 'B'),constraint_name为可选项,在其他模式数据库下,必须加上constraint_name。

  • index_name

    索引名。

    img 须知:

    • index_name仅在B模式数据库下(即sql_compatibility = 'B')支持,其他模式数据库下不支持。
    • 对于外键约束,constraint_name和index_name同时指定时,索引名为constraint_name。
    • 对于唯一键约束,constraint_name和index_name同时指定时,索引名以index_name。
  • USING method

    指定创建索引的方法。

    取值范围参考CREATE INDEX中的USING method参数。

    img 须知

    • USING method仅在B模式数据库下(即sql_compatibility = 'B')支持,其他模式数据库下不支持。

    • 在B模式下,未指定USING method时,对于ASTORE的存储方式,默认索引方法为btree;对于USTORE的存储方式,默认索引方法为ubtree。

  • ASC | DESC

    ASC表示指定按升序排序(默认)。DESC指定按降序排序。

    img 须知:ASC|DESC只在B模式数据库下(即sql_compatibility = 'B')支持,其他模式数据库不支持。

  • expression

    创建一个基于该表的一个或多个字段的表达式索引约束,必须写在圆括弧中。

    img 须知:表达式索引只在B模式数据库下支持(即sql_compatibility = 'B'),其他模式数据库不支持。

  • data_type

    字段的数据类型。

  • column_constraint

    字段的类型约束中,添加了mysql的ON UPDATE特性,归类于字段类型约束。与DEFAULT属性属于同类约束。该ON UPDATE属性用于,执行UPDATE操作timestamp字段为缺省时,则自动更新timestamp字段的时间截。如果更新字段的数据内容与原来的数据内容一致,则其他含有ON UPDATE的字段的时间截不会自动更新。

    CREATE TABLE table_name(column_name timestamp ON UPDATE CURRENT_TIMESTAMP);
  • compress_mode

    表字段的压缩选项。该选项指定表字段优先使用的压缩算法。行存表不支持压缩。

    取值范围:DELTA、PREFIX、DICTIONARY、NUMSTR、NOCOMPRESS

    • DELTA压缩仅支持长度为1-8字节的数据类型(0 < pg_type.typlen <= 8)。
    • PREFIX、NUMSTR压缩仅支持变长数据类型(pg_type.typlen = -1)和NULL结尾的C字符串(pg_type.typlen = -2)。
    • 该压缩选项与列存表自适应压缩算法无关,后者为列存表内部数据存储采用的压缩算法,不支持用户指定。
  • CHARACTER SET | CHARSET charset

    只在B模式数据库下(即sql_compatibility = 'B')支持该语法,其他模式数据库不支持。指定表字段的字符集,单独指定时会将字段的字符序设置为指定的字符集的默认字符序。

  • COLLATE collation

    COLLATE子句指定列的排序规则(字符序)(该列必须是可排列的数据类型)。如果没有指定,则使用默认的排序规则。排序规则可以使用“select * from pg_collation;”命令从pg_collation系统表中查询,默认的排序规则为查询结果中以default开始的行。对于B模式数据库下(即sql_compatibility = 'B')还支持utf8mb4_bin、utf8mb4_general_ci、utf8mb4_unicode_ci、binary字符序。

    img说明:

    • 仅字符类型支持指定字符集,指定为binary字符集或字符序实际是将字符类型转化为对应的二进制类型,若类型映射不存在则报错。当前仅有TEXT类型转化为BLOB的映射。
    • 除binary字符集和字符序外,当前仅支持指定与数据库编码相同的字符集。
    • 未显式指定字段字符集或字符序时,若指定了表的默认字符集或字符序,字段字符集和字符序将从表上继承。若表的默认字符集或字符序不存在,当b_format_behavior_compat_options = 'default_collation'时,字段的字符集和字符序将继承当前数据库的字符集及其对应的默认字符序。

    表 1 B模式(即sql_compatibility = 'B')下支持的字符集和字符序介绍

    字符序名称 对应的字符集 描述
    utf8mb4_general_ci utf8mb4(即utf8) 使用通用排序规则,不区分大小写。
    utf8mb4_unicode_ci utf8mb4(即utf8) 使用通用排序规则,不区分大小写。
    utf8mb4_bin utf8mb4(即utf8) 使用二进制排序规则,区分大小写。
    binary binary 使用二进制排序规则。
    utf8_general_ci utf8 使用通用排序规则,不区分大小写。
    utf8_unicode_ci utf8 使用通用排序规则,不区分大小写。
    utf8_bin utf8 使用二进制排序规则,区分大小写。
  • LIKE source_table [ like_option ...]

    LIKE子句声明一个表,新表自动从这个表中继承所有字段名及其数据类型和非空约束。

    新表与源表之间在创建动作完毕之后是完全无关的。在源表做的任何修改都不会传播到新表中,并且也不可能在扫描源表的时候包含新表的数据。

    被复制的列和约束并不使用相同的名称进行融合。如果明确的指定了相同的名称或者在另外一个LIKE子句中,将会报错。

    • 源表上的字段缺省表达式只有在指定INCLUDING DEFAULTS时,才会复制到新表中。缺省是不包含缺省表达式的,即新表中的所有字段的缺省值都是NULL。
    • 源表上的CHECK约束仅在指定INCLUDING CONSTRAINTS时,会复制到新表中,而其他类型的约束永远不会复制到新表中。非空约束总是复制到新表中。此规则同时适用于表约束和列约束。
    • 如果指定了INCLUDING INDEXES,则源表上的索引也将在新表上创建,默认不建立索引。
    • 如果指定了INCLUDING STORAGE,则复制列的STORAGE设置会复制到新表中,默认情况下不包含STORAGE设置。
    • 如果指定了INCLUDING COMMENTS,则源表列、约束和索引的注释会复制到新表中。默认情况下,不复制源表的注释。
    • 如果指定了INCLUDING PARTITION,则源表的分区定义会复制到新表中,同时新表将不能再使用PARTITION BY子句。默认情况下,不拷贝源表的分区定义。如果源表上带有索引,可以使用INCLUDING PARTITION INCLUDING INDEXES语法实现。如果对分区表只使用INCLUDING INDEXES,目标表定义将是普通表,但是索引是分区索引,最后结果会报错,因为普通表不支持分区索引。
    • 如果指定了INCLUDING RELOPTIONS,则源表的存储参数(即源表的WITH子句)会复制到新表中。默认情况下,不复制源表的存储参数。
    • INCLUDING ALL包含了INCLUDING DEFAULTS、INCLUDING CONSTRAINTS、INCLUDING INDEXES、INCLUDING STORAGE、INCLUDING COMMENTS、INCLUDING PARTITION和INCLUDING RELOPTIONS的内容。
    • ATUO_INCREMENT列需要为主键或唯一约束的第一个字段,若复制包含AUTO_INCREAMENT列的表时指定EXCLUDING INDEX,将会报错。其中AUTO_INCREAMENT只在B库中生效。

    img 须知:

    • 如果源表包含serial、bigserial、smallserial、largeserial类型,或者源表字段的默认值是sequence,且sequence属于源表(通过CREATE SEQUENCE … OWNED BY创建),这些Sequence不会关联到新表中,新表中会重新创建属于自己的sequence。这和之前版本的处理逻辑不同。如果用户希望源表和新表共享Sequence,需要首先创建一个共享的Sequence(避免使用OWNED BY),并配置为源表字段默认值,这样创建的新表会和源表共享该Sequence。
    • 不建议将其他表私有的Sequence配置为源表字段的默认值,尤其是其他表只分布在特定的NodeGroup上,这可能导致CREATE TABLE … LIKE执行失败。另外,如果源表配置其他表私有的Sequence,当该表删除时Sequence也会连带删除,这样源表的Sequence将不可用。如果用户希望多个表共享Sequence,建议创建共享的Sequence。
    • 对于分区表EXCLUDING,需要配合INCLUDING ALL使用,如INCLUDING ALL EXCLUDING DEFAULTS,除源分区表的DEFAULTS,其它全包含。
    • 如果源表是本地临时表,则新表也必须是本地临时表,否则会报错。
    • 如果源表是hash或list分区表,则在CREATE TABLE … (LIKE … INCLUDIING PARTITION)时会报错,不支持复制hash或list分区表的分区,仅支持range分区。对于二级分区表,同样只支持range-range二级分区。
  • WITH ( { storage_parameter = value } [, ...] )

    这个子句为表或索引指定一个可选的存储参数。用于表的WITH子句还可以包含OIDS=FALSE表示不分配OID。

    img 说明:使用任意精度类型Numeric定义列时,建议指定精度p以及刻度s。在不指定精度和刻度时,会按输入的显示出来。

    参数的详细描述如下所示。

    • FILLFACTOR

      一个表的填充因子(fillfactor)是一个介于10和100之间的百分数。100(完全填充)是默认值。如果指定了较小的填充因子,INSERT操作仅按照填充因子指定的百分率填充表页。每个页上的剩余空间将用于在该页上更新行,这就使得UPDATE有机会在同一页上放置同一条记录的新版本,这比把新版本放置在其他页上更有效。对于一个从不更新的表将填充因子设为100是最佳选择,但是对于频繁更新的表,选择较小的填充因子则更加合适。该参数对于列存表没有意义。

      取值范围: 10~100

    • ORIENTATION

      指定表数据的存储方式,即行存方式、列存方式,该参数设置成功后就不再支持修改。

      取值范围:

      • ROW,表示表的数据将以行式存储。

        行存储适合于OLTP业务,适用于点查询或者增删操作较多的场景。

      • COLUMN,表示表的数据将以列式存储。

        列存储适合于数据仓库业务,此类型的表上会做大量的汇聚计算,且涉及的列操作较少。

      默认值:

      若指定表空间为普通表空间,默认值为ROW。

    • STORAGE_TYPE

      指定存储引擎类型,该参数设置成功后就不再支持修改。

      取值范围:

      • USTORE,表示表支持Inplace-Update存储引擎。
      • ASTORE,表示表支持Append-Only存储引擎。

      默认值:

      不指定表时,默认是Append-Only存储。

    • INIT_TD

      创建Ustore表时,指定初始化的TD个数,该参数只在创建Ustore表时才能设置生效。

      取值范围:2~128,默认值为4。

    • COMPRESSION

      指定表数据的压缩级别,它决定了表数据的压缩比以及压缩时间。一般来讲,压缩级别越高,压缩比也越大,压缩时间也越长;反之亦然。实际压缩比取决于加载的表数据的分布特征。MogDB 2.1版本之后支持行存表压缩。

      取值范围:

      列存表的有效值为YES/NO/LOW/MIDDLE/HIGH,默认值为LOW。

    • MAX_BATCHROW

      指定了在数据加载过程中一个存储单元可以容纳记录的最大数目。该参数只对列存表有效。

      取值范围: 10000~60000,默认60000。

    • PARTIAL_CLUSTER_ROWS

      指定了在数据加载过程中进行将局部聚簇存储的记录数目。该参数只对列存表有效。

      取值范围: 大于等于MAX_BATCHROW,建议取值为MAX_BATCHROW的整数倍。

    • DELTAROW_THRESHOLD

      指定列存表导入时小于多少行的数据进入delta表,只在GUC参数enable_delta_store开启时生效。该参数只对列存表有效。

      取值范围: 0~9999,默认值为100

    • segment

      使用段页式的方式存储。本参数仅支持行存表。不支持列存表、临时表、unlog表。不支持ustore存储引擎。

      取值范围: on/off

      默认值:off

    • dek_cipher

      透明数据加密密钥的密文。当开启enable_tde选项时会自动申请创建,用户不可单独指定。通过密钥轮转功能可以对密钥进行更新。

      取值范围: 字符串。

      默认值:不开启加密时默认为空。

    • hasuids

      参数开启:更新表元组时,为元组分配表级唯一标识id。

      取值范围:on/off。

      默认值:off。

    • collate

      在B模式数据库下(即sql_compatibility = 'B')用于记录表的默认字符序,一般只用于内部存储和导入导出,不推荐用户指定或修改。

      取值范围:B模式数据库中独立支持的字符序的oid。

      默认值:0。

    • autovacuum_vacuum_insert_threshold

      设置只插入表触发autovacuum的阈值。当表中新插入的记录数超过设定的阈值时,会触发对该表的autovacuum。

      取值范围:整型,[-1, INTMAX],取-1表示禁用对只插入表的autovacuum。

    • autovacuum_vacuum_insert_scale_factor

      设置只插入表触发autovacuum时增加到autovacuum_vacuum_insert_threshold的表大小的缩放系数。

      取值范围:浮点型,[0, 100]

  • WITHOUT OIDS

    等价于WITH(OIDS=FALSE)的语法。

  • ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP }

    ON COMMIT选项决定在事务中执行创建临时表操作,当事务提交时,此临时表的后续操作。有以下三个选项,当前支持PRESERVE ROWS和DELETE ROWS选项。

    • PRESERVE ROWS(缺省值):提交时不对临时表做任何操作,临时表及其表数据保持不变。
    • DELETE ROWS:提交时删除临时表中数据。
    • DROP:提交时删除此临时表。只支持本地临时表,不支持全局临时表。
  • COMPRESS | NOCOMPRESS

    创建新表时,需要在CREATE TABLE语句中指定关键字COMPRESS,这样,当对该表进行批量插入时就会触发压缩特性。该特性会在页范围内扫描所有元组数据,生成字典、压缩元组数据并进行存储。指定关键字NOCOMPRESS则不对表进行压缩。

    缺省值:NOCOMPRESS,即不对元组数据进行压缩。

  • TABLESPACE tablespace_name

    创建新表时指定此关键字,表示新表将要在指定表空间内创建。如果没有声明,将使用默认表空间。

  • COMMNET {=| } text

    创建新表时指定此关键字,表示新表的注释内容。如果没有声明,则不创建注释。

  • CONSTRAINT constraint_name

    列约束或表约束的名称。可选的约束子句用于声明约束,新行或者更新的行必须满足这些约束才能成功插入或更新。

    定义约束有两种方法:

    • 列约束:作为一个列定义的一部分,仅影响该列。
    • 表约束:不和某个列绑在一起,可以作用于多个列。
  • NOT NULL

    字段值不允许为NULL。

  • NULL

    字段值允许为NULL ,这是缺省值。

    这个子句只是为和非标准SQL数据库兼容。不建议使用。

  • CHECK ( expression )

    CHECK约束声明一个布尔表达式,每次要插入的新行或者要更新的行的新值必须使表达式结果为真或未知才能成功,否则会抛出一个异常并且不会修改数据库。

    声明为字段约束的检查约束应该只引用该字段的数值,而在表约束里出现的表达式可以引用多个字段。

    img 说明:expression表达式中,如果存在“<>NULL”或“!=NULL”,这种写法是无效的,需要写成“is NOT NULL”。

  • DEFAULT default_expr

    DEFAULT子句给字段指定缺省值。该数值可以是任何不含变量的表达式(不允许使用子查询和对本表中的其他字段的交叉引用)。缺省表达式的数据类型必须和字段类型匹配。

    缺省表达式将被用于任何未声明该字段数值的插入操作。如果没有指定缺省值则缺省值为NULL 。

  • GENERATED ALWAYS AS ( generation_expr ) [STORED]

    该子句将字段创建为生成列,生成列的值在写入(插入或更新)数据时由generation_expr计算得到,STORED表示像普通列一样存储生成列的值。

    img 说明:

  • STORED关键字可省略,与不省略STORED语义相同。
  • 生成表达式不能以任何方式引用当前行以外的其他数据。生成表达式不能引用其他生成列,不能引用系统列。生成表达式不能返回结果集,不能使用子查询,不能使用聚集函数,不能使用窗口函数。生成表达式调用的函数只能是不可变(IMMUTABLE)函数。
  • 不能为生成列指定默认值。
  • 生成列不能作为分区键的一部分。
  • 生成列不能和ON UPDATE约束字句的CASCADE,SET NULL,SET DEFAULT动作同时指定。生成列不能和ON DELETE约束字句的SET NULL,SET DEFAULT动作同时指定。
  • 修改和删除生成列的方法和普通列相同。删除生成列依赖的普通列,生成列被自动删除。不能改变生成列所依赖的列的类型。
  • 生成列不能被直接写入。在INSERT或UPDATE命令中, 不能为生成列指定值, 但是可以指定关键字DEFAULT。
  • 生成列的权限控制和普通列一样。
  • 列存表、内存表MOT不支持生成列。外表中仅postgres_fdw支持生成列。
  • AUTO_INCREMENT

    该关键字将字段指定为自动增长列。

    若在插入时不指定此列的值(或指定此列的值为0、NULL、DEFAULT),此列的值将由自增计数器自动增长得到。

    若插入或更新此列为一个大于当前自增计数器的值,执行成功后,自增计数器将刷新为此值。

    自增初始值由“AUTO_INCREMENT [ = ] value”子句设置,若不设置,默认为1。

    img 说明

    • 仅在参数sql_compatibility=B时可以指定自动增长列。
    • 自动增长列数据类型只能为整数类型、4字节或8字节浮点类型、布尔类型。
    • 每个表只能有一个自动增长列。
    • 自动增长列必须是主键约束或唯一约束的第一个字段。
    • 自动增长列不能指定DEFAULT缺省值。
    • CHECK约束的表达式中不能含有自动增长列。
    • 可以指定自动增长列允许NULL,若不指定,默认自动增长列含有NOT NULL约束。
    • 含有自动增长列的表创建时,会创建一个依赖于此列的序列作为自增计数器,不允许通过序列相关功能修改或删除此序列,可以查看序列的值。
    • 本地临时表中的自动增长列不会创建序列。
    • 自动增长列不支持列式存储。
    • 自增计数器自增和刷新操作不会回滚。
  • [DEFAULT] CHARACTER SET | CHARSET [ = ] default_charset

    仅在sql_compatibility='B'时支持该语法。指定表的默认字符集,单独指定时会将表的默认字符序设置为指定的字符集的默认字符序。

  • [DEFAULT] COLLATE [ = ] default_collation

    仅在sql_compatibility='B'时支持该语法。指定表的默认字符序,单独指定时会将表的默认字符集设置为指定的字符序对应的字符集。字符序参见表1 B模式(即sql_compatibility = 'B')下支持的字符集和字符序介绍

    img 说明: 未显式指定表的字符集或字符序时,若指定了模式的默认字符集或字符序,表字符集和字符序将从模式上继承。若模式的默认字符集或字符序不存在,当b_format_behavior_compat_options = 'default_collation'时,表的字符集和字符序将继承当前数据库的字符集及其对应的默认字符序。

  • UNIQUE [KEY] index_parameters

    UNIQUE ( column_name [, … ] ) index_parameters

    UNIQUE约束表示表里的一个字段或多个字段的组合必须在全表范围内唯一。

    对于唯一约束,NULL被认为是互不相等的。

    UNIQUE KEY只能在sql_compatibility='B'时使用,与UNIQUE语义相同。

  • PRIMARY KEY index_parameters

    PRIMARY KEY ( column_name [, ...] ) index_parameters

    主键约束声明表中的一个或者多个字段只能包含唯一的非NULL值。

    一个表只能声明一个主键。

  • REFERENCES reftable [ ( refcolum ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] (column constraint)

    FOREIGN KEY ( column_name [, ...] ) REFERENCES reftable [ ( refcolumn [, ...] ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] (table constraint)

    外键约束要求新表中一列或多列构成的组应该只包含、匹配被参考表中被参考字段值。若省略refcolum,则将使用reftable的主键。被参考列应该是被参考表中的唯一字段或主键。外键约束不能被定义在临时表和永久表之间。

    参考字段与被参考字段之间存在三种类型匹配,分别是:

    • MATCH FULL:不允许一个多字段外键的字段为NULL,除非全部外键字段都是NULL。
    • MATCH SIMPLE(缺省):允许任意外键字段为NULL。
    • MATCH PARTIAL:目前暂不支持。

    另外,当被参考表中的数据发生改变时,某些操作也会在新表对应字段的数据上执行。ON DELETE子句声明当被参考表中的被参考行被删除时要执行的操作。ON UPDATE子句声明当被参考表中的被参考字段数据更新时要执行的操作。对于ON DELETE子句、ON UPDATE子句的可能动作:

    • NO ACTION(缺省):删除或更新时,创建一个表明违反外键约束的错误。若约束可推迟,且若仍存在任何引用行,那这个错误将会在检查约束的时候产生。
    • RESTRICT:删除或更新时,创建一个表明违反外键约束的错误。与NO ACTION相同,只是动作不可推迟。
    • CASCADE:删除新表中任何引用了被删除行的行,或更新新表中引用行的字段值为被参考字段的新值。
    • SET NULL:设置引用字段为NULL。
    • SET DEFAULT:设置引用字段为它们的缺省值。
  • DEFERRABLE | NOT DEFERRABLE

    这两个关键字设置该约束是否可推迟。一个不可推迟的约束将在每条命令之后马上检查。可推迟约束可以推迟到事务结尾使用SET CONSTRAINTS命令检查。缺省是NOT DEFERRABLE。目前,UNIQUE约束、主键约束、外键约束可以接受这个子句。所有其他约束类型都是不可推迟的。

    img说明

    Ustore表不支持DEFERRABLE以及INITIALLY DEFERRED关键字。

  • COMMENT text

    注释。

  • VISIBLE | INVISIBLE

    指定索引是否可见,如果没有声明则默认为VISIBLE。

  • PARTIAL CLUSTER KEY

    局部聚簇存储,列存表导入数据时按照指定的列(单列或多列),进行局部排序。

  • INITIALLY IMMEDIATE | INITIALLY DEFERRED

    如果约束是可推迟的,则这个子句声明检查约束的缺省时间。

    • 如果约束是INITIALLY IMMEDIATE(缺省),则在每条语句执行之后就立即检查它;
    • 如果约束是INITIALLY DEFERRED ,则只有在事务结尾才检查它。

    约束检查的时间可以用SET CONSTRAINTS命令修改。

  • USING INDEX TABLESPACE tablespace_name

    为UNIQUE或PRIMARY KEY约束相关的索引声明一个表空间。如果没有提供这个子句,这个索引将在default_tablespace中创建,如果default_tablespace为空,将使用数据库的缺省表空间。

  • ENCRYPTION_TYPE = encryption_type_value

    为ENCRYPTED WITH约束中的加密类型,encryption_type_value的值为[ DETERMINISTIC | RANDOMIZED ]

示例

--创建简单的表。
MogDB=# CREATE TABLE warehouse_t1
(
    W_WAREHOUSE_SK            INTEGER               NOT NULL,
    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
    W_WAREHOUSE_SQ_FT         INTEGER                       ,
    W_STREET_NUMBER           CHAR(10)                      ,
    W_STREET_NAME             VARCHAR(60)                   ,
    W_STREET_TYPE             CHAR(15)                      ,
    W_SUITE_NUMBER            CHAR(10)                      ,
    W_CITY                    VARCHAR(60)                   ,
    W_COUNTY                  VARCHAR(30)                   ,
    W_STATE                   CHAR(2)                       ,
    W_ZIP                     CHAR(10)                      ,
    W_COUNTRY                 VARCHAR(20)                   ,
    W_GMT_OFFSET              DECIMAL(5,2)
);

MogDB=# CREATE TABLE warehouse_t2
(
    W_WAREHOUSE_SK            INTEGER               NOT NULL,
    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
    W_WAREHOUSE_SQ_FT         INTEGER                       ,
    W_STREET_NUMBER           CHAR(10)                      ,
    W_STREET_NAME             VARCHAR(60),
    W_STREET_TYPE             CHAR(15)                      ,
    W_SUITE_NUMBER            CHAR(10)                      ,
    W_CITY                    VARCHAR(60)                   ,
    W_COUNTY                  VARCHAR(30)                   ,
    W_STATE                   CHAR(2)                       ,
    W_ZIP                     CHAR(10)                      ,
    W_COUNTRY                 VARCHAR(20)                   ,
    W_GMT_OFFSET              DECIMAL(5,2)
);
--创建表,并指定W_STATE字段的缺省值为GA。
MogDB=# CREATE TABLE warehouse_t3
(
    W_WAREHOUSE_SK            INTEGER               NOT NULL,
    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
    W_WAREHOUSE_SQ_FT         INTEGER                       ,
    W_STREET_NUMBER           CHAR(10)                      ,
    W_STREET_NAME             VARCHAR(60)                   ,
    W_STREET_TYPE             CHAR(15)                      ,
    W_SUITE_NUMBER            CHAR(10)                      ,
    W_CITY                    VARCHAR(60)                   ,
    W_COUNTY                  VARCHAR(30)                   ,
    W_STATE                   CHAR(2)           DEFAULT 'GA',
    W_ZIP                     CHAR(10)                      ,
    W_COUNTRY                 VARCHAR(20)                   ,
    W_GMT_OFFSET              DECIMAL(5,2)
);

--创建表,并在事务结束时检查W_WAREHOUSE_NAME字段是否有重复。
MogDB=# CREATE TABLE warehouse_t4
(
    W_WAREHOUSE_SK            INTEGER                NOT NULL,
    W_WAREHOUSE_ID            CHAR(16)               NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)   UNIQUE DEFERRABLE,
    W_WAREHOUSE_SQ_FT         INTEGER                        ,
    W_STREET_NUMBER           CHAR(10)                       ,
    W_STREET_NAME             VARCHAR(60)                    ,
    W_STREET_TYPE             CHAR(15)                       ,
    W_SUITE_NUMBER            CHAR(10)                       ,
    W_CITY                    VARCHAR(60)                    ,
    W_COUNTY                  VARCHAR(30)                    ,
    W_STATE                   CHAR(2)                        ,
    W_ZIP                     CHAR(10)                       ,
    W_COUNTRY                 VARCHAR(20)                    ,
    W_GMT_OFFSET              DECIMAL(5,2)
);
--创建一个带有70%填充因子的表。
MogDB=# CREATE TABLE warehouse_t5
(
    W_WAREHOUSE_SK            INTEGER                NOT NULL,
    W_WAREHOUSE_ID            CHAR(16)               NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)                    ,
    W_WAREHOUSE_SQ_FT         INTEGER                        ,
    W_STREET_NUMBER           CHAR(10)                       ,
    W_STREET_NAME             VARCHAR(60)                    ,
    W_STREET_TYPE             CHAR(15)                       ,
    W_SUITE_NUMBER            CHAR(10)                       ,
    W_CITY                    VARCHAR(60)                    ,
    W_COUNTY                  VARCHAR(30)                    ,
    W_STATE                   CHAR(2)                        ,
    W_ZIP                     CHAR(10)                       ,
    W_COUNTRY                 VARCHAR(20)                    ,
    W_GMT_OFFSET              DECIMAL(5,2),
    UNIQUE(W_WAREHOUSE_NAME) WITH(fillfactor=70)
);

--或者用下面的语法。
MogDB=# CREATE TABLE warehouse_t6
(
    W_WAREHOUSE_SK            INTEGER                NOT NULL,
    W_WAREHOUSE_ID            CHAR(16)               NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)              UNIQUE,
    W_WAREHOUSE_SQ_FT         INTEGER                        ,
    W_STREET_NUMBER           CHAR(10)                       ,
    W_STREET_NAME             VARCHAR(60)                    ,
    W_STREET_TYPE             CHAR(15)                       ,
    W_SUITE_NUMBER            CHAR(10)                       ,
    W_CITY                    VARCHAR(60)                    ,
    W_COUNTY                  VARCHAR(30)                    ,
    W_STATE                   CHAR(2)                        ,
    W_ZIP                     CHAR(10)                       ,
    W_COUNTRY                 VARCHAR(20)                    ,
    W_GMT_OFFSET              DECIMAL(5,2)
) WITH(fillfactor=70);

--创建表,并指定该表数据不写入预写日志。
MogDB=# CREATE UNLOGGED TABLE warehouse_t7
(
    W_WAREHOUSE_SK            INTEGER               NOT NULL,
    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
    W_WAREHOUSE_SQ_FT         INTEGER                       ,
    W_STREET_NUMBER           CHAR(10)                      ,
    W_STREET_NAME             VARCHAR(60)                   ,
    W_STREET_TYPE             CHAR(15)                      ,
    W_SUITE_NUMBER            CHAR(10)                      ,
    W_CITY                    VARCHAR(60)                   ,
    W_COUNTY                  VARCHAR(30)                   ,
    W_STATE                   CHAR(2)                       ,
    W_ZIP                     CHAR(10)                      ,
    W_COUNTRY                 VARCHAR(20)                   ,
    W_GMT_OFFSET              DECIMAL(5,2)
);

--创建临时表。
MogDB=# CREATE TEMPORARY TABLE warehouse_t24
(
    W_WAREHOUSE_SK            INTEGER               NOT NULL,
    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
    W_WAREHOUSE_SQ_FT         INTEGER                       ,
    W_STREET_NUMBER           CHAR(10)                      ,
    W_STREET_NAME             VARCHAR(60)                   ,
    W_STREET_TYPE             CHAR(15)                      ,
    W_SUITE_NUMBER            CHAR(10)                      ,
    W_CITY                    VARCHAR(60)                   ,
    W_COUNTY                  VARCHAR(30)                   ,
    W_STATE                   CHAR(2)                       ,
    W_ZIP                     CHAR(10)                      ,
    W_COUNTRY                 VARCHAR(20)                   ,
    W_GMT_OFFSET              DECIMAL(5,2)
);

--创建本地临时表,并指定提交事务时删除该临时表数据。
MogDB=# CREATE TEMPORARY TABLE warehouse_t25
(
    W_WAREHOUSE_SK            INTEGER               NOT NULL,
    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
    W_WAREHOUSE_SQ_FT         INTEGER                       ,
    W_STREET_NUMBER           CHAR(10)                      ,
    W_STREET_NAME             VARCHAR(60)                   ,
    W_STREET_TYPE             CHAR(15)                      ,
    W_SUITE_NUMBER            CHAR(10)                      ,
    W_CITY                    VARCHAR(60)                   ,
    W_COUNTY                  VARCHAR(30)                   ,
    W_STATE                   CHAR(2)                       ,
    W_ZIP                     CHAR(10)                      ,
    W_COUNTRY                 VARCHAR(20)                   ,
    W_GMT_OFFSET              DECIMAL(5,2)
) ON COMMIT DELETE ROWS;

--创建全局临时表,并指定会话结束时删除该临时表数据。当前Ustore存储引擎不支持全局临时表。
MogDB=# CREATE GLOBAL TEMPORARY TABLE gtt1
(
    ID                        INTEGER               NOT NULL,
    NAME                      CHAR(16)              NOT NULL,
    ADDRESS                   VARCHAR(50)                   ,
    POSTCODE                  CHAR(6)
) ON COMMIT PRESERVE ROWS;

--创建表时,不希望因为表已存在而报错。
MogDB=# CREATE TABLE IF NOT EXISTS warehouse_t8
(
    W_WAREHOUSE_SK            INTEGER               NOT NULL,
    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
    W_WAREHOUSE_SQ_FT         INTEGER                       ,
    W_STREET_NUMBER           CHAR(10)                      ,
    W_STREET_NAME             VARCHAR(60)                   ,
    W_STREET_TYPE             CHAR(15)                      ,
    W_SUITE_NUMBER            CHAR(10)                      ,
    W_CITY                    VARCHAR(60)                   ,
    W_COUNTY                  VARCHAR(30)                   ,
    W_STATE                   CHAR(2)                       ,
    W_ZIP                     CHAR(10)                      ,
    W_COUNTRY                 VARCHAR(20)                   ,
    W_GMT_OFFSET              DECIMAL(5,2)
);

--创建普通表空间。
MogDB=# CREATE TABLESPACE DS_TABLESPACE1 RELATIVE LOCATION 'tablespace/tablespace_1';
--创建表时,指定表空间。
MogDB=# CREATE TABLE warehouse_t9
(
    W_WAREHOUSE_SK            INTEGER               NOT NULL,
    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
    W_WAREHOUSE_SQ_FT         INTEGER                       ,
    W_STREET_NUMBER           CHAR(10)                      ,
    W_STREET_NAME             VARCHAR(60)                   ,
    W_STREET_TYPE             CHAR(15)                      ,
    W_SUITE_NUMBER            CHAR(10)                      ,
    W_CITY                    VARCHAR(60)                   ,
    W_COUNTY                  VARCHAR(30)                   ,
    W_STATE                   CHAR(2)                       ,
    W_ZIP                     CHAR(10)                      ,
    W_COUNTRY                 VARCHAR(20)                   ,
    W_GMT_OFFSET              DECIMAL(5,2)
) TABLESPACE DS_TABLESPACE1;

--创建表时,单独指定W_WAREHOUSE_NAME的索引表空间。
MogDB=# CREATE TABLE warehouse_t10
(
    W_WAREHOUSE_SK            INTEGER               NOT NULL,
    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)           UNIQUE USING INDEX TABLESPACE DS_TABLESPACE1,
    W_WAREHOUSE_SQ_FT         INTEGER                       ,
    W_STREET_NUMBER           CHAR(10)                      ,
    W_STREET_NAME             VARCHAR(60)                   ,
    W_STREET_TYPE             CHAR(15)                      ,
    W_SUITE_NUMBER            CHAR(10)                      ,
    W_CITY                    VARCHAR(60)                   ,
    W_COUNTY                  VARCHAR(30)                   ,
    W_STATE                   CHAR(2)                       ,
    W_ZIP                     CHAR(10)                      ,
    W_COUNTRY                 VARCHAR(20)                   ,
    W_GMT_OFFSET              DECIMAL(5,2)
);
--创建一个有主键约束的表。
MogDB=# CREATE TABLE warehouse_t11
(
    W_WAREHOUSE_SK            INTEGER            PRIMARY KEY,
    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
    W_WAREHOUSE_SQ_FT         INTEGER                       ,
    W_STREET_NUMBER           CHAR(10)                      ,
    W_STREET_NAME             VARCHAR(60)                   ,
    W_STREET_TYPE             CHAR(15)                      ,
    W_SUITE_NUMBER            CHAR(10)                      ,
    W_CITY                    VARCHAR(60)                   ,
    W_COUNTY                  VARCHAR(30)                   ,
    W_STATE                   CHAR(2)                       ,
    W_ZIP                     CHAR(10)                      ,
    W_COUNTRY                 VARCHAR(20)                   ,
    W_GMT_OFFSET              DECIMAL(5,2)
);

---或是用下面的语法,效果完全一样。
MogDB=# CREATE TABLE warehouse_t12
(
    W_WAREHOUSE_SK            INTEGER               NOT NULL,
    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
    W_WAREHOUSE_SQ_FT         INTEGER                       ,
    W_STREET_NUMBER           CHAR(10)                      ,
    W_STREET_NAME             VARCHAR(60)                   ,
    W_STREET_TYPE             CHAR(15)                      ,
    W_SUITE_NUMBER            CHAR(10)                      ,
    W_CITY                    VARCHAR(60)                   ,
    W_COUNTY                  VARCHAR(30)                   ,
    W_STATE                   CHAR(2)                       ,
    W_ZIP                     CHAR(10)                      ,
    W_COUNTRY                 VARCHAR(20)                   ,
    W_GMT_OFFSET              DECIMAL(5,2),
    PRIMARY KEY(W_WAREHOUSE_SK)
);

--或是用下面的语法,指定约束的名称。
MogDB=# CREATE TABLE warehouse_t13
(
    W_WAREHOUSE_SK            INTEGER               NOT NULL,
    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
    W_WAREHOUSE_SQ_FT         INTEGER                       ,
    W_STREET_NUMBER           CHAR(10)                      ,
    W_STREET_NAME             VARCHAR(60)                   ,
    W_STREET_TYPE             CHAR(15)                      ,
    W_SUITE_NUMBER            CHAR(10)                      ,
    W_CITY                    VARCHAR(60)                   ,
    W_COUNTY                  VARCHAR(30)                   ,
    W_STATE                   CHAR(2)                       ,
    W_ZIP                     CHAR(10)                      ,
    W_COUNTRY                 VARCHAR(20)                   ,
    W_GMT_OFFSET              DECIMAL(5,2),
    CONSTRAINT W_CSTR_KEY1 PRIMARY KEY(W_WAREHOUSE_SK)
);

--创建一个有复合主键约束的表。
MogDB=# CREATE TABLE warehouse_t14
(
    W_WAREHOUSE_SK            INTEGER               NOT NULL,
    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
    W_WAREHOUSE_SQ_FT         INTEGER                       ,
    W_STREET_NUMBER           CHAR(10)                      ,
    W_STREET_NAME             VARCHAR(60)                   ,
    W_STREET_TYPE             CHAR(15)                      ,
    W_SUITE_NUMBER            CHAR(10)                      ,
    W_CITY                    VARCHAR(60)                   ,
    W_COUNTY                  VARCHAR(30)                   ,
    W_STATE                   CHAR(2)                       ,
    W_ZIP                     CHAR(10)                      ,
    W_COUNTRY                 VARCHAR(20)                   ,
    W_GMT_OFFSET              DECIMAL(5,2),
    CONSTRAINT W_CSTR_KEY2 PRIMARY KEY(W_WAREHOUSE_SK, W_WAREHOUSE_ID)
);
--创建列存表。
MogDB=# CREATE TABLE warehouse_t15
(
    W_WAREHOUSE_SK            INTEGER               NOT NULL,
    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
    W_WAREHOUSE_SQ_FT         INTEGER                       ,
    W_STREET_NUMBER           CHAR(10)                      ,
    W_STREET_NAME             VARCHAR(60)                   ,
    W_STREET_TYPE             CHAR(15)                      ,
    W_SUITE_NUMBER            CHAR(10)                      ,
    W_CITY                    VARCHAR(60)                   ,
    W_COUNTY                  VARCHAR(30)                   ,
    W_STATE                   CHAR(2)                       ,
    W_ZIP                     CHAR(10)                      ,
    W_COUNTRY                 VARCHAR(20)                   ,
    W_GMT_OFFSET              DECIMAL(5,2)
) WITH (ORIENTATION = COLUMN);

--创建局部聚簇存储的列存表。
MogDB=# CREATE TABLE warehouse_t16
(
    W_WAREHOUSE_SK            INTEGER               NOT NULL,
    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
    W_WAREHOUSE_SQ_FT         INTEGER                       ,
    W_STREET_NUMBER           CHAR(10)                      ,
    W_STREET_NAME             VARCHAR(60)                   ,
    W_STREET_TYPE             CHAR(15)                      ,
    W_SUITE_NUMBER            CHAR(10)                      ,
    W_CITY                    VARCHAR(60)                   ,
    W_COUNTY                  VARCHAR(30)                   ,
    W_STATE                   CHAR(2)                       ,
    W_ZIP                     CHAR(10)                      ,
    W_COUNTRY                 VARCHAR(20)                   ,
    W_GMT_OFFSET              DECIMAL(5,2),
    PARTIAL CLUSTER KEY(W_WAREHOUSE_SK, W_WAREHOUSE_ID)
) WITH (ORIENTATION = COLUMN);

--定义一个带压缩的列存表。
MogDB=# CREATE TABLE warehouse_t17
(
    W_WAREHOUSE_SK            INTEGER               NOT NULL,
    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
    W_WAREHOUSE_SQ_FT         INTEGER                       ,
    W_STREET_NUMBER           CHAR(10)                      ,
    W_STREET_NAME             VARCHAR(60)                   ,
    W_STREET_TYPE             CHAR(15)                      ,
    W_SUITE_NUMBER            CHAR(10)                      ,
    W_CITY                    VARCHAR(60)                   ,
    W_COUNTY                  VARCHAR(30)                   ,
    W_STATE                   CHAR(2)                       ,
    W_ZIP                     CHAR(10)                      ,
    W_COUNTRY                 VARCHAR(20)                   ,
    W_GMT_OFFSET              DECIMAL(5,2)
) WITH (ORIENTATION = COLUMN, COMPRESSION=HIGH);

--定义一个带压缩的行存表。
MogDB=# CREATE TABLE table_3213
(
  c_w_id         integer        not null,
  c_d_id         integer        not null,
  c_id           integer        not null,
  c_discount     decimal(4,4),
  c_credit       char(2),
  c_last         varchar(16),
  c_first        varchar(16),
  c_credit_lim   decimal(12,2),
  c_balance      decimal(12,2),
  c_ytd_payment  decimal(12,2),
  c_payment_cnt  integer,
  c_delivery_cnt integer,
  c_street_1     varchar(20),
  c_street_2     varchar(20),
  c_city         varchar(20),
  c_state        char(2),
  c_zip          char(9),
  c_phone        char(16),
  c_since        timestamp on update current_timestamp,
  c_middle       char(2),
  c_data         varchar(500)
) WITH (COMPRESSION = YES);

--创建行压缩表时,指定列的mode。
MogDB=# CREATE TABLE compress_18
(
  a00 int DELTA,
  a01 int DICTIONARY,
  a02 int NOCOMPRESS,
  a03 varchar(100) PREFIX,
  a04 int
) WITH (COMPRESSION = YES);

--对于通过WITH (COMPRESSION = YES)所创建的行压缩表,或者普通表通过SET COMPRESS改过之后的行压缩表,新增列可以通过下面的方式指定新增列的mode。
MogDB=# ALTER TABLE test1 ADD COLUMN al char(5) PREFIX;

--定义一个检查列约束。
MogDB=# CREATE TABLE warehouse_t19
(
    W_WAREHOUSE_SK            INTEGER               PRIMARY KEY CHECK (W_WAREHOUSE_SK > 0),
    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)           CHECK (W_WAREHOUSE_NAME IS NOT NULL),
    W_WAREHOUSE_SQ_FT         INTEGER                       ,
    W_STREET_NUMBER           CHAR(10)                      ,
    W_STREET_NAME             VARCHAR(60)                   ,
    W_STREET_TYPE             CHAR(15)                      ,
    W_SUITE_NUMBER            CHAR(10)                      ,
    W_CITY                    VARCHAR(60)                   ,
    W_COUNTY                  VARCHAR(30)                   ,
    W_STATE                   CHAR(2)                       ,
    W_ZIP                     CHAR(10)                      ,
    W_COUNTRY                 VARCHAR(20)                   ,
    W_GMT_OFFSET              DECIMAL(5,2)
);

MogDB=# CREATE TABLE warehouse_t20
(
    W_WAREHOUSE_SK            INTEGER               PRIMARY KEY,
    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)           CHECK (W_WAREHOUSE_NAME IS NOT NULL),
    W_WAREHOUSE_SQ_FT         INTEGER                       ,
    W_STREET_NUMBER           CHAR(10)                      ,
    W_STREET_NAME             VARCHAR(60)                   ,
    W_STREET_TYPE             CHAR(15)                      ,
    W_SUITE_NUMBER            CHAR(10)                      ,
    W_CITY                    VARCHAR(60)                   ,
    W_COUNTY                  VARCHAR(30)                   ,
    W_STATE                   CHAR(2)                       ,
    W_ZIP                     CHAR(10)                      ,
    W_COUNTRY                 VARCHAR(20)                   ,
    W_GMT_OFFSET              DECIMAL(5,2),
    CONSTRAINT W_CONSTR_KEY2 CHECK(W_WAREHOUSE_SK > 0 AND W_WAREHOUSE_NAME IS NOT NULL)
);

--创建一个有外键约束的表。
MogDB=# CREATE TABLE city_t23
(
    W_CITY            VARCHAR(60)                PRIMARY KEY,
    W_ADDRESS       TEXT
);
MogDB=# CREATE TABLE warehouse_t23
(
    W_WAREHOUSE_SK            INTEGER               NOT NULL,
    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
    W_WAREHOUSE_SQ_FT         INTEGER                       ,
    W_STREET_NUMBER           CHAR(10)                      ,
    W_STREET_NAME             VARCHAR(60)                   ,
    W_STREET_TYPE             CHAR(15)                      ,
    W_SUITE_NUMBER            CHAR(10)                      ,
    W_CITY                    VARCHAR(60)           REFERENCES city_t23(W_CITY),
    W_COUNTY                  VARCHAR(30)                   ,
    W_STATE                   CHAR(2)                       ,
    W_ZIP                     CHAR(10)                      ,
    W_COUNTRY                 VARCHAR(20)                   ,
    W_GMT_OFFSET              DECIMAL(5,2)
);

--或是用下面的语法,效果完全一样。
MogDB=# CREATE TABLE warehouse_t23
(
    W_WAREHOUSE_SK            INTEGER               NOT NULL,
    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
    W_WAREHOUSE_SQ_FT         INTEGER                       ,
    W_STREET_NUMBER           CHAR(10)                      ,
    W_STREET_NAME             VARCHAR(60)                   ,
    W_STREET_TYPE             CHAR(15)                      ,
    W_SUITE_NUMBER            CHAR(10)                      ,
    W_CITY                    VARCHAR(60)                   ,
    W_COUNTY                  VARCHAR(30)                   ,
    W_STATE                   CHAR(2)                       ,
    W_ZIP                     CHAR(10)                      ,
    W_COUNTRY                 VARCHAR(20)                   ,
    W_GMT_OFFSET              DECIMAL(5,2)                  ,
    FOREIGN KEY(W_CITY) REFERENCES city_t23(W_CITY)
);

--或是用下面的语法,指定约束的名称。
MogDB=# CREATE TABLE warehouse_t23
(
    W_WAREHOUSE_SK            INTEGER               NOT NULL,
    W_WAREHOUSE_ID            CHAR(16)              NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)                   ,
    W_WAREHOUSE_SQ_FT         INTEGER                       ,
    W_STREET_NUMBER           CHAR(10)                      ,
    W_STREET_NAME             VARCHAR(60)                   ,
    W_STREET_TYPE             CHAR(15)                      ,
    W_SUITE_NUMBER            CHAR(10)                      ,
    W_CITY                    VARCHAR(60)                   ,
    W_COUNTY                  VARCHAR(30)                   ,
    W_STATE                   CHAR(2)                       ,
    W_ZIP                     CHAR(10)                      ,
    W_COUNTRY                 VARCHAR(20)                   ,
    W_GMT_OFFSET              DECIMAL(5,2)                  ,
    CONSTRAINT W_FORE_KEY1 FOREIGN KEY(W_CITY) REFERENCES city_t23(W_CITY)
);

--向warehouse_t19表中增加一个varchar列。
MogDB=# ALTER TABLE warehouse_t19 ADD W_GOODS_CATEGORY varchar(30);

--给warehouse_t19表增加一个检查约束。
MogDB=# ALTER TABLE warehouse_t19 ADD CONSTRAINT W_CONSTR_KEY4 CHECK (W_STATE IS NOT NULL);

--在一个操作中改变两个现存字段的类型。
MogDB=# ALTER TABLE warehouse_t19
    ALTER COLUMN W_GOODS_CATEGORY TYPE varchar(80),
    ALTER COLUMN W_STREET_NAME TYPE varchar(100);

--此语句与上面语句等效。
MogDB=# ALTER TABLE warehouse_t19 MODIFY (W_GOODS_CATEGORY varchar(30), W_STREET_NAME varchar(60));

--给一个已存在字段添加非空约束。
MogDB=# ALTER TABLE warehouse_t19 ALTER COLUMN W_GOODS_CATEGORY SET NOT NULL;

--移除已存在字段的非空约束。
MogDB=# ALTER TABLE warehouse_t19 ALTER COLUMN W_GOODS_CATEGORY DROP NOT NULL;

--如果列存表中还未指定局部聚簇,向在一个列存表中添加局部聚簇列。
MogDB=# ALTER TABLE warehouse_t17 ADD PARTIAL CLUSTER KEY(W_WAREHOUSE_SK);

--查看约束的名称,并删除一个列存表中的局部聚簇列。
MogDB=# \d+ warehouse_t17
                              Table "warehouse_t17"
      Column       |         Type          | Modifiers | Storage  | Stats target | Description
-------------------+-----------------------+-----------+----------+--------------+-------------
 w_warehouse_sk    | integer               | not null  | plain    |              |
 w_warehouse_id    | character(16)         | not null  | extended |              |
 w_warehouse_name  | character varying(20) |           | extended |              |
 w_warehouse_sq_ft | integer               |           | plain    |              |
 w_street_number   | character(10)         |           | extended |              |
 w_street_name     | character varying(60) |           | extended |              |
 w_street_type     | character(15)         |           | extended |              |
 w_suite_number    | character(10)         |           | extended |              |
 w_city            | character varying(60) |           | extended |              |
 w_county          | character varying(30) |           | extended |              |
 w_state           | character(2)          |           | extended |              |
 w_zip             | character(10)         |           | extended |              |
 w_country         | character varying(20) |           | extended |              |
 w_gmt_offset      | numeric(5,2)          |           | main     |              |
Partial Cluster :
    "warehouse_t17_cluster" PARTIAL CLUSTER KEY (w_warehouse_sk)
Has OIDs: no
Location Nodes: ALL DATANODES
Options: compression=no, version=0.12
MogDB=# ALTER TABLE warehouse_t17 DROP CONSTRAINT warehouse_t17_cluster;

--将表移动到另一个表空间。
MogDB=# ALTER TABLE warehouse_t19 SET TABLESPACE PG_DEFAULT;
--创建模式joe。
MogDB=# CREATE SCHEMA joe;

--将表移动到另一个模式中。
MogDB=# ALTER TABLE warehouse_t19 SET SCHEMA joe;

--重命名已存在的表。
MogDB=# ALTER TABLE joe.warehouse_t19 RENAME TO warehouse_t23;

--从warehouse_t23表中删除一个字段。
MogDB=# ALTER TABLE joe.warehouse_t23 DROP COLUMN W_STREET_NAME;

--创建带INVISIBLE唯一索引的表,需要在B兼容性数据库下
MogDB=# CREATE TABLE tpcds.warehouse_t26
(
    W_WAREHOUSE_SK            INTEGER                NOT NULL,
    W_WAREHOUSE_ID            CHAR(16)               NOT NULL,
    W_WAREHOUSE_NAME          VARCHAR(20)              UNIQUE,
    W_WAREHOUSE_SQ_FT         INTEGER                        ,
    W_STREET_NUMBER           CHAR(10)                       ,
    W_STREET_NAME             VARCHAR(60)                    ,
    W_STREET_TYPE             CHAR(15)                       ,
    W_SUITE_NUMBER            CHAR(10)                       ,
    W_CITY                    VARCHAR(60)                    ,
    W_COUNTY                  VARCHAR(30)                    ,
    W_STATE                   CHAR(2)                        ,
    W_ZIP                     CHAR(10)                       ,
    W_COUNTRY                 VARCHAR(20)                    ,
    W_GMT_OFFSET              DECIMAL(5,2)                   ,
    UNIQUE uni_t26 (W_WAREHOUSE_SK) INVISIBLE
) WITH(fillfactor=70);

--删除表空间、模式joe和模式表warehouse。
MogDB=# DROP TABLE warehouse_t1;
MogDB=# DROP TABLE warehouse_t2;
MogDB=# DROP TABLE warehouse_t3;
MogDB=# DROP TABLE warehouse_t4;
MogDB=# DROP TABLE warehouse_t5;
MogDB=# DROP TABLE warehouse_t6;
MogDB=# DROP TABLE warehouse_t7;
MogDB=# DROP TABLE warehouse_t8;
MogDB=# DROP TABLE warehouse_t9;
MogDB=# DROP TABLE warehouse_t10;
MogDB=# DROP TABLE warehouse_t11;
MogDB=# DROP TABLE warehouse_t12;
MogDB=# DROP TABLE warehouse_t13;
MogDB=# DROP TABLE warehouse_t14;
MogDB=# DROP TABLE warehouse_t15;
MogDB=# DROP TABLE warehouse_t16;
MogDB=# DROP TABLE warehouse_t17;
MogDB=# DROP TABLE warehouse_t18;
MogDB=# DROP TABLE warehouse_t20;
MogDB=# DROP TABLE warehouse_t21;
MogDB=# DROP TABLE warehouse_t22;
MogDB=# DROP TABLE joe.warehouse_t23;
MogDB=# DROP TABLE warehouse_t24;
MogDB=# DROP TABLE warehouse_t25;
MogDB=# DROP TABLE tpcds.warehouse_t26;
MogDB=# DROP TABLESPACE DS_TABLESPACE1;
MogDB=# DROP SCHEMA IF EXISTS joe CASCADE;

相关链接

ALTER TABLE, DROP TABLECREATE TABLESPACE

Copyright © 2011-2024 www.enmotech.com All rights reserved.