pgsql.cc 提供对 postgresql.org 官网内容的中文翻译,由 Pigsty 团队维护。
CREATE TABLE — Creates a new table
CREATE [ TEMPORARY | TEMP ] TABLEtable(columntype[ NULL | NOT NULL ] [ UNIQUE ] [ DEFAULTvalue] [column_constraint_clause| PRIMARY KEY } [ ... ] ] [, ... ] [, PRIMARY KEY (column[, ...] ) ] [, CHECK (condition) ] [,table_constraint_clause] ) [ INHERITS (inherited_table[, ...] ) ]
该表仅为本次会话创建,并在会话退出时自动删除。 在临时表存在期间,同名的现有永久表不可见。
table要创建的新类或表的名称。
column列的名称。
type列的类型。这可以包括数组说明符。有关数据类型和数组的更多信息, 请参阅 PostgreSQL 用户指南。
value列的默认值。详见 DEFAULT 子句。
column_constraint_clause可选的列约束子句指定一组完整性约束(测试),要使插入或更新操作 成功,新条目或更新后的条目必须满足这些约束。每个约束都必须能求值 为布尔表达式。尽管 SQL92 要求 column_constraint_clause 只引用该列,Postgres 却允许在单个列约束中 引用多个列。详见列约束子句。
table_constraint_clause可选的表 CONSTRAINT 子句指定一组完整性约束,要使插入或更新操作 成功,新条目或更新后的条目必须满足这些约束。每个约束都必须能求值 为布尔表达式。单个约束中可以引用多个列。一个表只能指定一个 PRIMARY KEY 子句;PRIMARY KEY column (表约束)与 PRIMARY KEY(列约束)互斥。详见表约束子句。
inherited_table可选的 INHERITS 子句指定一组表名,该表自动从中继承所有字段。 如果某个被继承的字段名出现多于一次, Postgres 会报错。 Postgres 会自动让新表继承其在继承层次中 上方表上的函数。
CREATE表创建成功时返回的消息。
ERROR表创建失败时返回的消息。通常还伴随一些描述性文字,例如: ERROR: Relation ' ,如果指定的表在数据库中已存在,就会在运行时出现该错误。table' already exists
ERROR: DEFAULT: type mismatched如果默认值的数据类型与列定义的数据类型不匹配。
CREATE TABLE 将向当前数据库中输入一个新的类或表。 该表将由发出命令的用户“拥有”。
每个 type 可以是简单类型、复杂类型(集合)或数组类型。每个属性都可以指定为非空, 并且都可以有默认值,默认值由 DEFAULT 子句 指定。
从 Postgres 6.0 版起,不再强制同一属性内的数组维数一致。 这一点在将来的版本中很可能会改变。
可选的 INHERITS 子句指定一组类名,该类自动从中继承所有字段。如果某个被继承的字段名 出现多于一次,Postgres 会报错。Postgres 会自动让新类继承其在继承层次 中上方类上的函数。函数的继承按照 Common Lisp Object System(CLOS) 的惯例进行。
每个新表或类 table 都会自动创建为一种类型。因此,该类的一个或多个实例自动成为一种类型, 并可用于 ALTER TABLE 或其他 CREATE TABLE 语句。
新表作为堆创建,不含初始数据。一个表最多可以有 1600 列(现实中, 由于元组大小必须小于 8192 字节,这个上限还会更低),某些站点还可能 把该上限配置得更低。表不能与系统目录表同名。
DEFAULT value
value默认值表达式可能的取值有:
无。
DEFAULT 子句为一个列指定默认数据值(通过 CREATE TABLE 语句中的 列定义)。默认值的数据类型必须与列定义的数据类型匹配。
如果一个 INSERT 操作涉及的列没有指定默认值,且没有为它提供显式 数据值,那么将把 NULL 值赋给该列。Default literal 表示默认值就是指定的常量值。Default niladic-function 或 user-function 表示默认值是 INSERT 时该指定函数的值。
niladic 函数有两种类型:
为列 did 和 number 指定常量作为 默认值,并为列 did 指定一个字符串字面值:
CREATE TABLE video_sales (
did VARCHAR(40) DEFAULT 'luso films',
number INTEGER DEFAULT 0,
total CASH DEFAULT '$0.0'
);
为列 did 指定一个已存在的序列作为默认值, 并为列 name 指定一个字面值:
CREATE TABLE distributors (
did DECIMAL(3) DEFAULT NEXTVAL('serial'),
name VARCHAR(40) DEFAULT 'luso films'
);
[ CONSTRAINTname] { [ NULL | NOT NULL ] | UNIQUE | PRIMARY KEY | CHECKconstraint| REFERENCESreftable(refcolumn) [ MATCHmatchtype] [ ON DELETEaction] [ ON UPDATEaction] [ [ NOT ] DEFERRABLE ] [ INITIALLYchecktime] } [, ...]
name赋予完整性约束的一个任意名称。如果未指定 name,它将由表名和列名 生成,这应当能保证 name 的唯一性。
该列允许包含 NULL 值。这是默认情况。
该列不允许包含 NULL 值。这等价于列约束 CHECK (column NOT NULL)。
该列必须具有唯一值。在 Postgres 中,这是通过在表上隐式创建一个唯一索引来强制实现的。
该列是一个主键,这蕴含着唯一性由系统强制,并且其他表可以把该列 当作行的唯一标识符来依赖。详见 PRIMARY KEY。
constraint约束的定义。
可选的约束子句指定约束(测试),要使插入或更新操作成功,新条目或 更新后的条目必须满足这些约束。每个约束都必须能求值为布尔表达式。 单个约束中可以引用多个属性。PRIMARY KEY 作为表约束使用与作为列约束 使用互不相容。
约束是一条命名的规则:一个通过对在基表上执行的 INSERT、UPDATE 或 DELETE 操作的结果加以限制,来帮助定义有效值集合的 SQL 对象。
定义完整性约束有两种方式:稍后讲述的表约束,以及这里讲述的列约束。
列约束是作为列定义的一部分定义的完整性约束,一旦创建,在逻辑上就成为 表约束。可用的列约束有:
| PRIMARY KEY |
| REFERENCES |
| UNIQUE |
| CHECK |
| NOT NULL |
[ CONSTRAINT name ] NOT NULL
NOT NULL 约束指定一条规则:一列只能包含非空值。 这只是列约束,不允许作为表约束。
statusERROR: ExecAppend: Fail to add null value in not null attribute "column".如果试图向一个带 NOT NULL 约束的列插入空值,就会在运行时出现该错误。
在表 distributors 上定义两个 NOT NULL 列约束, 其中一个是命名约束:
CREATE TABLE distributors (
did DECIMAL(3) CONSTRAINT no_null NOT NULL,
name VARCHAR(40) NOT NULL
);
[ CONSTRAINT name ] UNIQUE
name赋予约束的一个任意标签。
statusERROR: Cannot insert a duplicate key into a unique index.如果试图向一个列插入重复值,就会在运行时出现该错误。
UNIQUE 约束指定一条规则:表中一个或多个不同列组成的一组只能包含唯一值。
被指定列的列定义不必包含 NOT NULL 约束就可以纳入 UNIQUE 约束。 一个不带 NOT NULL 约束的列中有多个空值并不违反 UNIQUE 约束。 (这偏离了 SQL92 的定义,但是一个更合乎常理的 约定。详见兼容性一节。)
每个 UNIQUE 列约束所命名的列,必须与为该表定义的任何其他 UNIQUE 或 PRIMARY KEY 约束所命名的列集合不同。
Postgres 会自动为每个 UNIQUE 约束创建一个 唯一索引,以确保数据完整性。详见 CREATE INDEX。
为表 distributors 定义一个 UNIQUE 列约束。UNIQUE 列约束只能定义在 表的一列上:
CREATE TABLE distributors (
did DECIMAL(3),
name VARCHAR(40) UNIQUE
);
它等价于把以下内容指定为表约束:
CREATE TABLE distributors (
did DECIMAL(3),
name VARCHAR(40),
UNIQUE(name)
);
[ CONSTRAINTname] CHECK (condition[, ...] )
name赋予约束的一个任意名称。
condition任何产生布尔结果的合法条件表达式。
statusERROR: ExecAppend: rejected due to CHECK constraint "table_column".如果试图向一个受 CHECK 约束约束的列插入非法值,就会在运行时 出现该错误。
CHECK 约束对列中允许的值指定一个限制。CHECK 约束也允许作为表约束。
SQL92 的 CHECK 列约束只能定义在表的一列上并只引用该列。 Postgres 没有这一限制。
[ CONSTRAINT name ] PRIMARY KEY
name约束的一个任意名称。
ERROR: Cannot insert a duplicate key into a unique index.如果试图向一个受 PRIMARY KEY 约束约束的列插入重复值,就会在 运行时出现该错误。
PRIMARY KEY 列约束指定一个表的某一列只能包含唯一(非重复)的非 NULL 值。 被指定列的定义不必包含显式的 NOT NULL 约束就可以纳入 PRIMARY KEY 约束。
一个表只能指定一个 PRIMARY KEY。
Postgres 会自动创建一个唯一索引来确保 数据完整性。(见 CREATE INDEX 语句)
PRIMARY KEY 约束所命名的列集合应当与为同一表定义的任何 UNIQUE 约束 所命名的列集合不同,否则会导致等价索引的重复和不必要的额外运行时开销。 不过,Postgres 并不特别禁止这样做。
[ CONSTRAINTname] REFERENCESreftable[ (refcolumn) ] [ MATCHmatchtype] [ ON DELETEaction] [ ON UPDATEaction] [ [ NOT ] DEFERRABLE ] [ INITIALLYchecktime]
REFERENCES 约束指定一条规则:一个列的值会对照另一个列的值进行检查。 REFERENCES 也可以作为 FOREIGN KEY 表约束的一部分来指定。
name约束的一个任意名称。
reftable包含要对照检查的数据的表。
refcolumnreftable 中要对照检查数据的列。 如果未指定,则使用 reftable 的 PRIMARY KEY。
matchtype共有三种匹配类型:MATCH FULL、MATCH PARTIAL,以及未指定时的默认 匹配类型。MATCH FULL 不允许多列外键中的某一列为 NULL,除非所有 外键列都为 NULL。默认的 MATCH 类型允许某些外键列为 NULL 而外键的 其他部分不为 NULL。MATCH PARTIAL 目前不支持。
action被引用表中被引用的行被删除时要执行的动作。有下列动作。
如果违反外键则产生错误。这是默认值。
与 NO ACTION 相同。
删除任何引用被删除行的行。
将引用列的值设置为 NULL。
将引用列的值设置为它们的默认值。
action被引用表中被引用的列被更新为新值时要执行的动作。如果行被更新了, 但被引用的列没有变化,则不执行任何动作。有下列动作。
如果违反外键则产生错误。这是默认值。
与 NO ACTION 相同。
将引用列的值更新为被引用列的新值。
将引用列的值设置为 NULL。
将引用列的值设置为它们的默认值。
这控制约束是否可以推迟到事务结束检查。如果为 DEFERRABLE, SET CONSTRAINTS ALL DEFERRED 将使外键只在事务结束时才被检查。 NOT DEFERRABLE 是默认值。
checktimechecktime 有两个可能的值, 指定检查约束的默认时间。
只在事务结束时检查约束。
每条语句之后检查约束。这是默认值。
statusERROR: name referential integrity violation - key referenced from table not found in reftable如果试图向一个列插入的值在被引用表中没有匹配的列,就会在运行时 出现该错误。
REFERENCES 列约束指定一个表的某一列只能包含与被引用表的被引用列中的值 相匹配的值。
加入该列的值会按照给定的匹配类型,与被引用表和被引用列中的值进行 匹配。此外,当被引用列的数据变化时,会对该列的匹配数据执行相应动作。
目前 Postgres 只支持 MATCH FULL 和一个默认 匹配类型。此外,被引用列应当是被引用表中某个 UNIQUE 约束的列, 不过 Postgres 并不强制这一点。
[ CONSTRAINT name ] { PRIMARY KEY | UNIQUE } ( column [, ...] )
[ CONSTRAINT name ] CHECK ( constraint )
[ CONSTRAINT name ] FOREIGN KEY ( column [, ...] )
REFERENCES reftable
(refcolumn [, ...] )
[ MATCH matchtype ]
[ ON DELETE action ]
[ ON UPDATE action ]
[ [ NOT ] DEFERRABLE ]
[ INITIALLY checktime ]
name赋予完整性约束的一个任意名称。
column [, ...]要为其定义唯一索引的列名,对于 PRIMARY KEY 还要加 NOT NULL 约束。
constraint )一个将被作为约束求值的布尔表达式。
表约束子句可能的输出与列约束子句相应部分的输出相同。
表约束是定义在一个基表的一列或多列上的完整性约束。 “表约束”的四种变体是:
| UNIQUE |
| CHECK |
| PRIMARY KEY |
| FOREIGN KEY |
[ CONSTRAINTname] UNIQUE (column[, ...] )
name赋予完整性约束的一个任意名称。
column表中某一列的名称。
status如果试图向一个列插入重复值,就会在运行时出现该错误。
UNIQUE 约束指定一条规则:表中一个或多个不同列组成的一组只能包含唯一值。 UNIQUE 表约束的行为与列约束相同,只是它还能跨越多列。
更多细节见 UNIQUE 列约束一节。
为表 distributors 定义一个 UNIQUE 表约束:
CREATE TABLE distributors (
did DECIMAL(03),
name VARCHAR(40),
UNIQUE(name)
);
[ CONSTRAINTname] PRIMARY KEY (column[, ...] )
name约束的一个任意名称。
column [, ...]表中一列或多列的名称。
status如果试图向一个受 PRIMARY KEY 约束约束的列插入重复值,就会在 运行时出现该错误。
PRIMARY KEY 约束指定一条规则:表中一个或多个不同列组成的一组只能 包含唯一(非重复)的非空值。被指定列的列定义不必包含 NOT NULL 约束就可以纳入 PRIMARY KEY 约束。
PRIMARY KEY 表约束与相应的列约束类似,只是它还能涵盖多列。
更多信息见 PRIMARY KEY 列约束一节。
[ CONSTRAINTname] FOREIGN KEY (column[, ...] ) REFERENCESreftable[ (refcolumn[, ...] ) ] [ MATCHmatchtype] [ ON DELETEaction] [ ON UPDATEaction] [ [ NOT ] DEFERRABLE ] [ INITIALLYchecktime]
REFERENCES 约束指定一条规则:一个列的值会对照另一个列的值进行检查。 REFERENCES 也可以作为 FOREIGN KEY 表约束的一部分来指定。
name约束的一个任意名称。
column [, ...]表中一列或多列的名称。
reftable包含要对照检查的数据的表。
referenced column [, ...]reftable 中要对照检查数据的 一列或多列。如果未指定,则使用 reftable 的 PRIMARY KEY。
matchtype共有三种匹配类型:MATCH FULL、MATCH PARTIAL,以及未指定时的默认 匹配类型。MATCH FULL 不允许多列外键中的某一列为 NULL,除非所有 外键列都为 NULL。默认的 MATCH 类型允许某些外键列为 NULL 而外键的 其他部分不为 NULL。MATCH PARTIAL 目前不支持。
action被引用表中被引用的行被删除时要执行的动作。有下列动作。
如果违反外键则产生错误。这是默认值。
与 NO ACTION 相同。
删除任何引用被删除行的行。
将引用列的值设置为 NULL。
将引用列的值设置为它们的默认值。
action被引用表中被引用的列被更新为新值时要执行的动作。如果行被更新了, 但被引用的列没有变化,则不执行任何动作。有下列动作。
如果违反外键则产生错误。这是默认值。
不允许更新被引用的行。
将引用列的值更新为被引用列的新值。
将引用列的值设置为 NULL。
将引用列的值设置为它们的默认值。
这控制约束是否可以推迟到事务结束检查。如果为 DEFERRABLE, SET CONSTRAINTS ALL DEFERRED 将使外键只在事务结束时才被检查。 NOT DEFERRABLE 是默认值。
checktimechecktime 有两个可能的值, 指定检查约束的默认时间。
每条语句之后检查约束。这是默认值。
只在事务结束时检查约束。
statusERROR: name referential integrity violation - key referenced from table not found in reftable如果试图向一个列插入的值在被引用表中没有匹配的列,就会在运行时 出现该错误。
FOREIGN KEY 约束指定一条规则:表中一个或多个不同列组成的一组与 被引用表中一组不同的列相关联。
FOREIGN KEY 表约束与相应的列约束类似,只是它还能涵盖多列。
更多信息见 FOREIGN KEY 列约束一节。
创建表 films 和表 distributors:
CREATE TABLE films (
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 distributors (
did DECIMAL(03) PRIMARY KEY DEFAULT NEXTVAL('serial'),
name VARCHAR(40) NOT NULL CHECK (name <> '')
);
创建一个带二维数组的表:
CREATE TABLE array (
vector INT[][]
);
为表 films 定义一个 UNIQUE 表约束。UNIQUE 表约束可以定义在表的一列或 多列上:
CREATE TABLE films (
code CHAR(5),
title VARCHAR(40),
did DECIMAL(03),
date_prod DATE,
kind CHAR(10),
len INTERVAL HOUR TO MINUTE,
CONSTRAINT production UNIQUE(date_prod)
);
定义一个 CHECK 列约束:
CREATE TABLE distributors (
did DECIMAL(3) CHECK (did > 100),
name VARCHAR(40)
);
定义一个 CHECK 表约束:
CREATE TABLE distributors (
did DECIMAL(3),
name VARCHAR(40)
CONSTRAINT con1 CHECK (did > 100 AND name > '')
);
为表 films 定义一个 PRIMARY KEY 表约束。PRIMARY KEY 表约束可以定义在 表的一列或多列上:
CREATE TABLE films (
code CHAR(05),
title VARCHAR(40),
did DECIMAL(03),
date_prod DATE,
kind CHAR(10),
len INTERVAL HOUR TO MINUTE,
CONSTRAINT code_title PRIMARY KEY(code,title)
);
为表 distributors 定义一个 PRIMARY KEY 列约束。PRIMARY KEY 列约束只能 定义在表的一列上(下面两个示例是等价的):
CREATE TABLE distributors (
did DECIMAL(03),
name CHAR VARYING(40),
PRIMARY KEY(did)
);
CREATE TABLE distributors (
did DECIMAL(03) PRIMARY KEY,
name VARCHAR(40)
);
CREATE TABLE/INHERITS 是 Postgres 的语言扩展。
除本地可见的临时表外,SQL92 还定义了 CREATE GLOBAL TEMPORARY TABLE 语句,以及一个可选的 ON COMMIT 子句:
CREATE GLOBAL TEMPORARY TABLEtable(columntype[ DEFAULTvalue] [ CONSTRAINTcolumn_constraint] [, ...] ) [ CONSTRAINTtable_constraint] [ ON COMMIT { DELETE | PRESERVE } ROWS ]
对于临时表,CREATE GLOBAL TEMPORARY TABLE 语句命名一个对其他客户端可见 的新表,并定义该表的列和约束。
CREATE TEMPORARY TABLE 的可选 ON COMMIT 子句指定每当执行 COMMIT 时是否清空临时表中的行。如果省略 ON COMMIT 子句,则假定使用默认 选项 ON COMMIT DELETE ROWS。
创建一个临时表:
CREATE TEMPORARY TABLE actors (
id DECIMAL(03),
name VARCHAR(40),
CONSTRAINT actor_id CHECK (id < 150)
) ON COMMIT DELETE ROWS;
SQL92 为 UNIQUE 指定了一些额外的能力:
表约束定义:
[ CONSTRAINTname] UNIQUE (column[, ...] ) [ { INITIALLY DEFERRED | INITIALLY IMMEDIATE } ] [ [ NOT ] DEFERRABLE ]
列约束定义:
[ CONSTRAINT name ] UNIQUE
[ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
[ [ NOT ] DEFERRABLE ]
NULL“约束”(实际上是一个非约束)是 Postgres 对 SQL92 的扩展,加入它是为了 与 NOT NULL 子句对称。由于它是任何列的默认情况,它的出现只是噪音。
[ CONSTRAINT name ] NULL
SQL92 为 NOT NULL 指定了一些额外的能力:
[ CONSTRAINT name ] NOT NULL
[ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
[ [ NOT ] DEFERRABLE ]
SQL92 为约束指定了一些额外的能力,并且还定义了断言和域约束。
Postgres 尚不支持域和断言。
断言是一种特殊类型的完整性约束,与其他约束共享同一名字空间。不过, 断言不一定像约束那样依赖于某个特定的基表,因此 SQL-92 提供了 CREATE ASSERTION 语句作为定义约束的另一种方法:
CREATE ASSERTIONnameCHECK (condition)
域约束由 CREATE DOMAIN 或 ALTER DOMAIN 语句定义:
域约束:
[ CONSTRAINTname] CHECKconstraint[ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ]
表约束定义:
[ CONSTRAINTname] { PRIMARY KEY (column, ... ) | FOREIGN KEYconstraint| UNIQUEconstraint| CHECKconstraint} [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ]
列约束定义:
[ CONSTRAINTname] { NOT NULL | PRIMARY KEY | FOREIGN KEYconstraint| UNIQUE | CHECKconstraint} [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ]
一个 CONSTRAINT 定义可以按任意顺序包含一个可推迟性属性子句和/或一个 初始约束模式子句。
该约束必须在每条语句结束时检查。SET CONSTRAINTS ALL DEFERRED 对这种类型的约束没有影响。
这控制约束是否可以推迟到事务结束检查。如果使用了 SET CONSTRAINTS ALL DEFERRED,或者约束被设置为 INITIALLY DEFERRED,这将使外键 只在事务结束时才被检查。
SET CONSTRAINT 只改变当前事务的外键约束模式。
只在事务结束时检查约束。这是默认值
每条语句之后检查约束。
SQL92 为表约束或列约束中的 CHECK 指定了一些额外的能力。
表约束定义:
[ CONSTRAINTname] CHECK ( VALUEcondition) [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ]
列约束定义:
[ CONSTRAINTname] CHECK ( VALUEcondition) [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ]
SQL92 为 PRIMARY KEY 指定了一些额外的能力:
表约束定义:
[ CONSTRAINTname] PRIMARY KEY (column[, ...] ) [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ]
列约束定义:
[ CONSTRAINT name ] PRIMARY KEY
[ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
[ [ NOT ] DEFERRABLE ]
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。