CREATE TABLE

使用 CREATE TABLE 命令在当前数据库中创建一个初始为空的新表。 CREATE TABLE 命令会自动创建一个数据类型,表示与表的一行相对应的元组类型(结构类型)。

表格不能有
  • 与任何现有数据类型的名称相同。
  • 与系统目录表的名称相同。
  • 1600 多个专栏。 由于元组长度限制,有效限值略低。
  • 具有以下名称的表或视图属性:
    • 最大值
    • 厘金
    • 创建用户名
    • ctid
    • datasliceid
    • deletexid
    • oid
    • 行标识
    • 台球体
    • xmax
    • xmin

可选的约束子句指定了新记录或更新记录必须满足的约束(或测试),这样插入或更新操作才能成功。 约束是一种已命名的规则,即一种 SQL 对象,它通过限制对表进行插入、更新或删除操作的结果来帮助定义有效的值集。 Netezza Performance Server不支持约束检查;如果指定约束,则必须执行约束检查和参照完整性)

您可以定义表约束和列约束。
  • 列约束是列定义的一部分。
  • 表约束定义与特定列无关,可以包含多个列。

也可以将每个列约束写成表约束。 如果列约束只影响一列,那么列约束只是一种符号上的方便。

配送规格
Netezza Performance ServerRDBMS 数据库中的每个表只有一个分布键,分布键由一到四列组成。 您可以使用以下 SQL 语法创建分布键。
  • 要创建显式分发密钥,Netezza Performance ServerSQL 的语法是
    CREATE TABLE <tablename> [ ( <col>[,<col>… ] ) ] AS 
    <select_clause> [ DISTRIBUTE ON [HASH] ( <col>[<col>,… ] ) ]

    distribute on短语指定了分发密钥,"hash是可选项。

  • 要创建循环分配密钥,Netezza Performance ServerSQL 的语法是
    CREATE TABLE <tablename> (col1 int, col2 int, col3 int)
    DISTRIBUTE ON RANDOM;

    distribute on random表示循环分配。

  • 要在不指定分布键的情况下创建表格,Netezza Performance ServerSQL 语法为
    CREATE TABLE <tablename> (col1 int, col2 int, col3 int);

    Netezza Performance Server系统会选择一个分发密钥。 无法确保该密钥是什么,它可能因Netezza Performance Server软件版本而异。

约束规则行动
更新或删除约束时,可以指定以下操作。 由于系统不执行约束检查,因此这些规则只是被接受而不是被使用。
  • CASCADE 将引用列的值更新为被引用列的新值。
  • SET NULL 将引用列设置为被引用列的新值。
  • SET DEFAULT 设置引用列
  • 限制等于无行动
  • 如果违反外键,NO ACTION 会产生错误。
限制属性
约束可以有以下属性,这些属性决定了约束检查是立即进行还是延迟进行。 由于系统不执行约束检查,这些属性只是被接受而不是被使用。
  • [NOT] DEFERRABLE 决定是否在事务结束时检查约束。
  • INITIALLY DEFERRED 仅在事务结束时检查约束。
  • INITIALLY IMMEDIATE 会在每条语句后检查约束条件。

语法

创建表格命令的一般语法:
CREATE [ TEMPORARY | TEMP ] TABLE [IF NOT EXISTS] <table>
( <col> <type> [<col_constraint>][,<col> <type> [<col_constraint>]…]
[<table_constraint>[,<table_constraint>… ] )
[ DISTRIBUTE ON { RANDOM | [HASH] (<col>[,<col>…]) } ]
[ ORGANIZE ON { (<col>) | NONE } ]
[ ROW SECURITY ]
[ DATA_VERSION_RETENTION_TIME <number-of-days> ]
其中 "<col_constraint>代表
[ CONSTRAINT <constraint_name> ] 
{NOT NULL | NULL | UNIQUE | PRIMARY KEY | DEFAULT <value> | <ref>}
[ [ [ NOT ] DEFERRABLE ] { INITIALLY DEFERRED | INITIALLY IMMEDIATE } |
[ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ NOT ] DEFERRABLE ]
其中 "<table_constraint>代表
[ CONSTRAINT <constraint_name> ] 
{UNIQUE (<col>[,<col>…] ) |
PRIMARY KEY (<pkcol_name>[,<pkcol_name>…] ) |
FOREIGN KEY (<fkcol_name>[,<fkcol_name>…] ) <ref>}
[ [ [ NOT ] DEFERRABLE ] { INITIALLY DEFERRED | INITIALLY IMMEDIATE } |
[ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] [ NOT ] DEFERRABLE ]
其中 "<ref>代表
REFERENCES <reftable> [ (<refcol_name>[,<refcol_name>…] ) ]
[ MATCH FULL ]
[ ON UPDATE {CASCADE | RESTRICT | SET NULL | SET DEFAULT | NO ACTION} ]
[ ON DELETE {CASCADE | RESTRICT | SET NULL | SET DEFAULT | NO ACTION} ]

系统允许并维护主键、默认键、外键、唯一键和引用。 系统不支持约束检查和参照完整性。 用户必须确保约束检查和参照完整性。

输入

CREATE TABLE 命令需要以下输入:
表 1. 创建表输入
输入 描述
临时 要创建的表是临时表。
IF NOT EXISTS 如果当前数据库和模式中存在指定名称的表,则 CREATE TABLE 命令不会因无法创建表而出错。 该选项通常用于运行 SQL 命令的脚本应用程序,如果要抑制 "未找到表 "错误信息,则不会影响或停止脚本应用程序。 如果包含该选项,请注意以下行为:
  • 除非其他错误阻止了表的创建,否则即使命令没有创建表,也会返回 CREATE TABLE 消息。 (当同名表已经存在时,该选项会导致命令忽略失败)
  • 不会对现有表格和命令中指定的表格进行比较;表格的形状可能不同。 现有表格保持原样,其当前形状和行内容不变。 您的应用程序必须确保目标表和行符合预期。
  • IF NOT EXISTS 语法不能与 AS SELECT 子句一起使用。 这种形式的 CREATE TABLE 命令会出错。 如果要执行 CREATE TABLE ... 在使用 CREATE TABLE 之前,请考虑先调用 DROP TABLE IF EXISTS 命令,以确保数据库和模式中不存在目标表 ... AS SELECT 命令。
<table 要创建的表的名称。
<col 新表中要创建的列的名称。
<类型 列的数据类型。
分发时间 数据库中的每个表都必须有一个由一到四列组成的分配键。 默认值为 RANDOM,系统会选择一个随机分配密钥。
HASH 该参数可用于说明,但对命令没有影响。
组织时间 表格的列数(一至四列)。 不能为外部表指定此项。 如果指定了列,则表不能有任何物化视图,且所有指定的列数据类型必须是可分区映射的。 表数据重组在运行 GROOM TABLE 时生效。 有关详细信息,请参阅《IBM® Netezza®系统管理员指南》中的 "使用群集基表"。
赛道安全 创建具有行级安全性的表。
<约束名称 列约束或表约束的名称。 如果未指定名称,系统将生成一个名称。
不可推迟 | 可推迟 控制约束是否可以延迟到事务结束。 默认为 "不可更改"。 (Netezza Performance Server不支持约束检查和参照完整性)
INITIALLY 指定 DEFERRED(在交易结束时)或 IMMEDIATE(在每份报表结束时)。
not null | null 是否允许列包含空值。 NULL 是缺省值。
UNIQUE(列和表约束) 列中的每个值是否必须唯一。
PRIMARY KEY(列和表约束) 指定列是否构成表的主键。

该约束本质上是 UNIQUE 约束和 NOT NULL 约束的组合,但将一组列标识为主键还提供了有关模式设计的元数据。 主键意味着其他表可以依赖这组列作为行的唯一标识符。

一个表只能指定一个主键约束,可以是列约束,也可以是表约束。

组成主键的列集必须不同于为表定义的唯一约束所命名的任何其他列集。

DEFAULT(列约束) 该列每行的默认值。
引用(列约束) 新表的指定列必须只包含与指定表的指定列中的值相匹配的值。
FOREIGN KEY 和 REFERENCES 表(表约束) 新表的指定列必须只包含与指定表的指定列中的值相匹配的值。 如果没有指定列,则值必须与表的主键相匹配。 被引用表的指定列必须在该表中具有唯一或主键约束。
全场比赛 MATCH FULL 可以防止多列外键中的一列为空,如果外键的其他部分不是空的话。 这是缺省值。 MATCH PARTIAL 不支持。
更新时 | 删除时 更新或删除指定表格或列时要执行的操作:
NO ACTION
如果违反外键,则会出错。 这是缺省值。
RESTRICT
与 "无行动 "相同。
CASCADE
删除引用已删除记录的所有记录。
SET NULL
将引用列的值设置为默认值。
SET DEFAULT
将引用列的值设置为默认值。
DATA_VERSION_RETENTION_TIME <天数> <天数 创建的 tbl 表具有指定的 DATA_VERSION_RETENTION_TIME,如果没有指定,则从模式中获取该属性的当前值。 如果表的 DATA_VERSION_RETENTION_TIME 为 0(无论是明确指定还是从模式中继承),则无法为时态查询提供该表的历史数据。 不过,由于其他原因,删除的行可能会被保留。 例如,增量备份。 如果表的 DATA_VERSION_RETENTION_TIME 非零,则可为时态查询提供该天数之前的历史行。

DATA_VERSION_RETENTION_TIME 子句不能与 CREATE TEMPORARY 表一起使用。 所有临时表都是非时态表,不支持时间旅行查询。

最大允许值为 92 天,即一个日历季度的最长天数。

输出

该命令的输出结果如下:

表 2. 创建表输出
输出 描述
CREATE TABLE 如果命令成功完成,系统将返回此信息。
ERROR 如果表格创建失败,系统将返回此信息。 错误信息提供了描述性文本,例如ERROR: Relation 'table' already exists或其他信息。 如果指定 IF NOT EXISTS 语法,当当前数据库和模式中已存在同名表时,系统不会抛出错误。

特权

您必须是管理员用户、数据库或模式的所有者,或者您的账户必须具有创建表格权限。

用途

以下是使用示例:

  • 要创建表:
       CREATE TABLE name (
           code        CHARACTER(5) CONSTRAINT firstkey PRIMARY KEY,
           title       CHARACTER VARYING(40) NOT NULL,
           did         DECIMAL(3) NOT NULL,
           date_prod   DATE,
           kind        CHAR(10),
           len         INTERVAL HOUR TO MINUTE
       );
  • 要为表膜定义主键表约束,可以在表的一个或多个列上定义主键表约束:
    CREATE TABLE films (
           code        CHAR(5),
           title       VARCHAR(40),
           did         DECIMAL(3),
           date_prod   DATE,
           kind        VARCHAR(10),
           len         INTERVAL HOUR TO MINUTE,
           CONSTRAINT code_title PRIMARY KEY(code,title)
       );
  • 为表经销商定义主键约束:
    CREATE TABLE distributors (
        did     DECIMAL(3),
        name    CHAR VARYING(40),
        PRIMARY KEY(did)
    ); CREATE TABLE distributors (
        did     DECIMAL(3) PRIMARY KEY,
        name    VARCHAR(40)
    );

    这两个例子是等价的。 第一个示例使用表格约束语法。 第二个示例使用了列约束符号。

  • 在表分配器上定义两个不为空的列约束,其中一个明确为名称:
    CREATE TABLE distributors (
           did     DECIMAL(3) CONSTRAINT no_null NOT NULL,
           name    VARCHAR(40) NOT NULL
       );