CREATE TABLE

名称

CREATE TABLE — 创建一个新表

语法

CREATE [ TEMPORARY | TEMP ] TABLE table (
    column type
    [ NULL | NOT NULL ] [ UNIQUE ] [ DEFAULT value ]
    [column_constraint_clause | PRIMARY KEY } [ ... ] ]
    [, ... ]
    [, PRIMARY KEY ( column [, ...] ) ]
    [, CHECK ( condition ) ]
    [, table_constraint_clause ]
    ) [ INHERITS ( inherited_table [, ...] ) ]

输入

TEMPORARY
此表只是为这次会话创建,并且在会话结束后自动删除。当临时表存在时,同名的永久表是不可见的。
table
将要创建的新表的名称.
column
列/字段名.
type
列/字段类型.这里可以包括数组的声明.请参考 PostgreSQL 用户手册 获取关于数据类型和数组的详细信息.
DEFAULT value
一个列/字段的缺省值.请参考 DEFAULT 子句获取更多信息.
column_constraint_clause
可选的列/字段约束子句,声明一系列完整性约束和测试,当对表进行更新或插入操作时必须满足这些约束条件才能成功.每个约束必须生成一个布尔式.尽管 SQL92 要求 column_constraint_clause 只用于指定某一行,Postgres 允许在一个列/字段的约束里面引用多个列.请参考列约束子句获取更多信息.
table_constraint_clause
可选的表(约束) CONSTRAINT 子句,声明一系列整合的约束,当对表进行更新或插入时必须满足这些约束.每个约束必须生成一个布尔表达式.可以对多列使用同一个约束.一个表只能声明一个 PRIMARY KEY 子句;PRIMARY KEY column (表约束)和 PRIMARY KEY (列/字段约束)是互斥的. 请参考表约束子句获取更多信息.
INHERITS inherited_table
可选的(继承)INHERITS 子句声明一系列表名,这个表将自动从这些表继承所有字段.如果任何继承域出现的次数超过一次,Postgres 将报告一个错误. Postgres 自动地允许所创建的表继承所有其父表的函数.

输出

CREATE
成功创建表后的返回信息.
ERROR
如果创建表失败,返回此信息.通常还跟随一些描述文本,例如:ERROR: Relation 'table' already exists 在运行时出现,因为所声明的表已经在数据库中存在.
ERROR: DEFAULT: type mismatched
如果缺省数值的类型和字段定义的类型不一样,返回此错误.

描述

CREATE TABLE 将向当前数据库中追加一个表.表将为执行命令者"所有".

每个 type 可以是简单类型,复合(集)类型或者一个数组类型。每个属性都可以声明为非空并且每个都可以有一个缺省值,用 DEFAULT 子句.声明。

注意:对于 Postgres v6.0,一个属性内的数组维数的一致性不是强制的。这一点在以后的版本中将改变。
可选的 INHERITS 子句声明一个表集合,所创建的表自动从这个表集合里的表继承所有字段。如果任何继承的字段出现次数多于一次,Postgres 报告一个错误。Postgres 自动允许所创建的表继承那些在继承分级中级别比它高的表的函数。函数的继承是根据公共 Lisp 对象系统(Common Lisp Object System (CLOS))的习惯进行的。

每个新表或表 table 自动被创建为一个类型。因此表中的一条或更多实例自动就是一个类型,因而可以用于 ALTER TABLE 或其他 CREATE TABLE 语句。

新表将作为一个没有初始值的堆创建.一个表可以有不超过1600(事实上,这是因为受字段大小必须小于8192字节的限制)列,但是这个限制在一些节点上可以通过配置降低.一个表不能和系统表同名.

DEFAULT 子句

DEFAULT value

输入

value
    缺省的表达式值可以是:
    一个文本值
    一个用户函数
    a (译注:?不会翻译)niladic function

输出


描述

DEFAULT 子句向某列赋一个初始值.(通过在 CREATE TABLE 语句里面定义).缺省值的类型必须和列/字段定义的数据类型.

一个 INSERT 操作如果包括一个没有缺省值的列/字段,这时如果没有显式地提供该/列字段的数据值,将用一个NULL代替.缺省的 literal 意味着缺省值是声明的常量.缺省的 niladic-functionuser-function 意味着缺省值是在 INSERT 时声明的函数值.

有两类 (?)niladic 函数:
 
niladic USER
CURRENT_USER / USER
参阅 CURRENT_USER 函数
SESSION_USER
参阅 CURRENT_USER 函数
SYSTEM_USER
未实现
niladic datetime
CURRENT_DATE
参阅 CURRENT_DATE 函数
CURRENT_TIME
参阅 CURRENT_TIME 函数
CURRENT_TIMESTAMP
参阅 CURRENT_TIMESTAMP 函数

用法

给列/字段 didnumber 赋予一个常量值作为缺省值,一个字串赋予列/字段 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'
);

列/字段 CONSTRAINT 子句

[ CONSTRAINT name ] { [
    NULL | NOT NULL ] | UNIQUE | PRIMARY KEY | CHECK constraint | REFERENCES 
     reftable
     (refcolumn)
     [ MATCH matchtype ]
     [ ON DELETE action ] 
     [ ON UPDATE action ]
     [ [ NOT ] DEFERRABLE ] 
     [ INITIALLY checktime ] }
    [, ...]

输入

name
赋予整个约束的任意名称.如果没有声明 name ,将从表和列名称中生成一个唯一的名称用于 name.
NULL
列允许包含 NULL 值。这是缺省值。
NOT NULL
列不允许包含 NULL 值.与包含 CHECK 的列/字段相同(column NOT NULL).
UNIQUE
列/字段必须有一个唯一值.在 Postgres 这是通过在表上隐含地创建一个唯一索引实现的.
PRIMARY KEY
本列是一个主键,暗示着其唯一性是由系统强制提供的而且其他表可能依赖此列/字段作为行标识. 请参考 PRIMARY KEY 获取更多的信息.
constraint
约束的定义.

描述

可选的约束子句声明某种约束或者测试,当进行插入或者更新操作时,新的或者更新的记录必须满足这个约束或测试时操作才能成功。每个约束必须得出一个布尔表达式。多个字段/属性可以在一个约束里面引用。作为表约束的 PRIMARY KEY 的使用是与作为列约束的 PRIMARY KEY 互相冲突不可兼容的。

约束是一个命名的规则:它是一个 SQL 对象,它通过对 INSERT,UPDATE 或 DELETE 等对基本表的操作结果进行限制,进而可以获得有效的结果集.

有两种方法定义整合约束:表约束(随后提到),列/字段约束(将在这里说明).

一个列/字段约束是作为列定义的一部分定义的一个整合约束,而且逻辑上一旦创建就会成为表约束.可用的列约束:
 
PRIMARY KEY
REFERENCES
UNIQUE
CHECK
NOT NULL

NOT NULL 约束

[ CONSTRAINT name ] NOT NULL
NOT NULL 约束表明一个列只能包含非空(non-null)数值的规则.NOT NULL 约束只是一个列约束,不允许作为一个表约束.

输出

status
ERROR: 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
);

UNIQUE 约束

[ CONSTRAINT name ] UNIQUE

输入

CONSTRAINT name
赋予一个约束的任意标记.

输出

status
ERROR: Cannot insert a duplicate key into a unique index.
如果试图向列/字段中插入一个重复数值,返回此运行时错误.

描述

UNIQUE 约束表明一个这样的规则:表中一组由一个或多个独立列组成的集合中只能包含一个唯一的数值.

一个列/字段定义包含了 UNIQUE 约束,不一定要包含 NOT NULL 约束.在一个没有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)
);

CHECK (检查)约束

[ CONSTRAINT name ] CHECK
    ( condition [, ...] )

输入

name
赋予约束的任意名称.
condition
任何产生一个布尔值的有效的条件表达式.

输出

status
ERROR: ExecAppend: rejected due to CHECK constraint "table_column".
如果试图向列/字段中插入一个违反 CHECK 约束的数值,生成此运行时错误.

 

描述

CHECK 约束声明一个列中允许的数据的限制. CHECK 约束也可以做表约束.

SQL92 CHECK 列约束只能对表中的一列/字段进行定义或使用.Postgres没有这个限制.
 

PRIMARY KEY 约束

[ CONSTRAINT name ] PRIMARY KEY

输入

CONSTRAINT name
约束的任意名称.

输出

ERROR: Cannot insert a duplicate key into a unique index.
当你试图向一个有PRIMARY KEY 约束的列插入一个重复的数值时,将返回这个运行时信息.

描述

PRIMARY KEY 列约束表明表中的一个列/字段只能包含唯一的(不重复),非空的数值.在该列/字段的PRIMARY KEY 约束定义中不需要显式的包括NOT NULL 约束.
一个表只能声明一个 PRIMARY KEY.

注意

Postgres 自动创建一个唯一索引以保证数据的完整性.(参阅 CREATE INDEX 语句)

在同一个表中 PRIMARY KEY 约束定义的列应该应该和其他定义了 UNIQUE 约束的列不同名(不是同一列).因为这会导致等价索引的重复和增加不必要的处理.然而,Postgres 并没有明文禁止这些.

REFERENCES 约束

[ CONSTRAINT name ] REFERENCES reftable [ ( refcolumn ) ] 
    [ MATCH matchtype ]
    [ ON DELETE action ] 
    [ ON UPDATE action ]
    [ [ NOT ] DEFERRABLE ] 
    [ INITIALLY checktime ]
REFERENCES (参考)约束声明了一个规则:一个字段的数值要与另外一个字段的数值做对比检查.REFERENCES 还可以做为一个 FOREIGN KEY 表约束的一部分声明.

输入

CONSTRAINT name
约束的任意名称.
reftable
包含对比检查数据的表的名称.
refcolumn
reftable 里要做对比检查的字段名称.如果没有声明,使用表 reftable  的 PRIMARY KEY.
MATCH matchtype
有三种匹配类型:MATCH FULL,MATCH PARTIAL 和一种缺省的匹配类型(如果什么都没有声明的话).除非所有的外键字段都是  NULL,否则 MATCH FULL 将不允许一个多列/字段外键的某个列为 NULL.缺省的 MATCH 类型是允许某些外键字段是 NULL 而其他部分的外键字段不是 NULL.MATCH PARTIAL 目前不支持.
ON DELETE action
当一个参考表里的参考行要被删除时,要处理的动作.有下列动作.
NO ACTION
如果违反外键则产生错误.这是缺省.
RESTRICT
与 NO ACTION 相同.
CASCADE
删除任何引用参考行的行.
SET NULL
把参考列的值设为 NULL.
SET DEFAULT
把参考列的值设置为它们的缺省值.
ON UPDATE action

当一个参考表里的参考列要被更新时,要处理的动作.如果行被更新而参考列没有改变,不发生任何动作.有下面动作.
NO ACTION
如果违反外键则产生错误.这是缺省.
RESTRICT
与 NO ACTION 相同.
CASCADE
把参考列的值更新为被参考列的新值.
SET NULL
把参考列的值设置为 NULL.
SET DEFAULT
把参考列的值设置为缺省值.
[ NOT ] DEFERRABLE
这个选项控制该约束是否可以推迟到事务的结尾.如果 DEFERRABLE,SET CONSTRAINTS ALL DEFERRED 将导致只是在事务的结束时才检查外键.缺省是否NOT DEFERRABLE.

 
INITIALLY checktime
checktime 有两个可能的值用以声明检查约束的缺省时间.
DEFERRED
只在事务结尾检查约束.
IMMEDIATE
在每条语句(结尾)检查约束.这是缺省.

输出

status
ERROR: name referential integrity violation - key referenced from table not found in reftable

如果某人试图把一个数值插入到一个列中,而该列在被参考的表中没有匹配列,则生成这条运行时错误.

描述

REFERENCES 列约束指明一个表的某列必须只能包含匹配一个被参考表的某参考列的数据的数值.

向这个列追加的数值使用给出的匹配类型与被参考表的参考列进行匹配.另外,当被参考列的数据被修改,动作是对该列的当前数据进行比较.

注意

目前 Postgres 只支持 MATCH FULL 和一个缺省的匹配类型.另外,被参考表里的被参考列应该是一个有 UNIQUE 约束的列,不过 Postgres 并没有强制这一点.

表(约束) CONSTRAINT 子句

[ 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 ]

输入

CONSTRAINT name
完整性约束的任意名称.
column [, ...]
用于定义唯一索引,或 PRIMARY KEY,或 NOT NULL 约束的列/字段名.
CHECK ( constraint )
要作为约束进行估值的布尔表达式.

输出

表约束子句的可能输出和对应的列/字段约束的输出一样.

描述

表约束是对一个基本表的一个或多个列/字段定义的完整性约束."表约束"的四个元素是:
 
UNIQUE
CHECK
PRIMARY KEY
FOREIGN KEY

UNIQUE 约束

[ CONSTRAINT name ] UNIQUE ( column [, ...] )

输入

CONSTRAINT name
赋予约束的任意名称.
column
某表中的列/字段名.

输出

status
ERROR: Cannot insert a duplicate key into a unique index
如果试图向列中插入一个重复的值,将返回此错误.

描述

UNIQUE 约束表明表中由一个或若干个独立的列/字段组成的集合只能包含唯一的数值.表的 UNIQUE 约束和对应的列/字段约束的特性是一样的,区别是表约束可以跨越多个列/字段.
请参考列/字段的 UNIQUE 约束获取更多细节.

用法

给一个表 distributors 定义一个 UNIQUE 表约束:
CREATE TABLE distributors (
    did      DECIMAL(03),
    name     VARCHAR(40),
    UNIQUE(name)
);

PRIMARY KEY 约束

[ CONSTRAINT name ] PRIMARY KEY ( column [, ...] )

输入

CONSTRAINT name
赋予约束的任意名称.
column [, ...]
表中的一个或者多个列.

输出

status
ERROR: Cannot insert a duplicate key into a unique index.
如果试图向一个有 PRIMARY KEY 约束的表中插入重复值,返回这个运行时命令。

描述

PRIMARY KEY 约束表明某个表的由一个或多个列/字段组成的集合只能包含唯一,(不重复),非空数值.对声明的列定义的 PRIMARY KEY 约束不需要包括 NOT NULL 约束.

PRIMARY KEY 表约束与列/字段约束相似,区别是它具有控制多列/字段的能力.
 

请参考 PRIMARY KEY 列/字段约束部分获取更多信息.

REFERENCES (参考)约束

[ CONSTRAINT name ] FOREIGN KEY ( column [, ...] )
    REFERENCES reftable [ ( refcolumn [, ...] ) ] 
    [ MATCH matchtype ]
    [ ON DELETE action ] 
    [ ON UPDATE action ]
    [ [ NOT ] DEFERRABLE ]
    [ INITIALLY checktime ]
REFERENCES (参考)约束声明了一个规则:一个字段的数值要与另外一个字段的数值做对比检查.REFERENCES 还可以做为一个 FOREIGN KEY 表约束的一部分声明.

输入

CONSTRAINT name
约束的任意名称.
column [, ...]
表中的一个或者多个列的名称.
reftable
包含对比检查数据的表的名称.
referenced column [, ...]
reftable 里要做对比检查的一个或多个字段的名称.如果没有声明,使用表 reftable  的 PRIMARY KEY.
MATCH matchtype
有三种匹配类型:MATCH FULL,MATCH PARTIAL 和一种缺省的匹配类型(如果什么都没有声明的话).除非所有的外键字段都是  NULL,否则 MATCH FULL 将不允许一个多列/字段外键的某个列为 NULL.缺省的 MATCH 类型是允许某些外键字段是 NULL 而其他部分的外键字段不是 NULL.MATCH PARTIAL 目前不支持.
ON DELETE action
当一个被参考表里的被参考行要被删除时,要处理的动作.有下列动作.

 
NO ACTION
如果违反外键则产生错误.这是缺省.
RESTRICT
与 NO ACTION 相同.
CASCADE
删除任何引用参考行的行.
SET NULL
把参考列的值设为 NULL.
SET DEFAULT
把参考列的值设置为它们的缺省值.
ON UPDATE action

当一个被参考表里的被参考列要更新时,要处理的动作.如果行被更新而参考列没有改变,不发生任何动作.有下面动作.
NO ACTION
如果违反外键则产生错误.这是缺省.
RESTRICT
不允许被参考的列的更新.
CASCADE
把参考列的值更新为被参考列的新值.
SET NULL
把参考列的值设置为 NULL.
SET DEFAULT
把参考列的值设置为缺省值.
[ NOT ] DEFERRABLE
这个选项控制该约束是否可以推迟到事务的结尾.如果 DEFERRABLE,SET CONSTRAINTS ALL DEFERRED 将导致只是在事务的结束时才检查外键.缺省是否NOT DEFERRABLE.

 
INITIALLY checktime
checktime 有两个可能的值用以声明检查约束的缺省时间.

 
IMMEDIATE
在每条语句(结尾)检查约束.这是缺省.
DEFERRED
只在事务结尾检查约束.

输出

status
ERROR: 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 <> '')
);
创建一个有2维数组的表:
   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

除了本地可见的临时表外,SQL92还定义了一条 CREATE GLOBAL TEMPORARY TABLE 语句,和一个可选的 ON COMMIT 子句:
CREATE GLOBAL TEMPORARY TABLE table ( column type [
    DEFAULT value ] [ CONSTRAINT column_constraint ] [, ...] )
    [ CONSTRAINT table_constraint ] [ ON COMMIT { DELETE | PRESERVE } ROWS ]
对于临时表,CREATE TEMPORARY TABLE 语句定义一个其他客户端可见的新表和定义表的列/字段和约束。

CREATE TEMPORARY TABLE 可选的 ON COMMIT 子句用于声明当 COMMIT 事务时,是否需要将临时表的行清空.如果 ON COMMIT 子句省略了,(缺省值),就假设为 ON COMMIT DELETE ROWS (当COMMIT时清空).

要创建一个临时表:

CREATE TEMPORARY TABLE actors (
    id         DECIMAL(03),
    name       VARCHAR(40),
    CONSTRAINT actor_id CHECK (id < 150)
) ON COMMIT DELETE ROWS;

UNIQUE 子句

SQL92 对 UNIQUE 定义了一些附加的功能.

表约束定义:

[ CONSTRAINT name ] UNIQUE ( column [, ...] )
    [ { INITIALLY DEFERRED | INITIALLY IMMEDIATE } ]
    [ [ NOT ] DEFERRABLE ]
列/字段约束定义:
[ CONSTRAINT name ] UNIQUE
      [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
      [ [ NOT ] DEFERRABLE ]

NULL 子句

NULL "约束" (实际上不是一个约束)是一个 Postgres 对SQL92的扩展,把它包含进来是为了和 NOT NULL 子句对称。因为这是任何列的缺省,它的出现只是添乱。
[ CONSTRAINT name ] NULL

NOT NULL 子句

SQL92 对 NOT NULL 声明了一些附加的功能:
[ CONSTRAINT name ] NOT NULL 
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]

CONSTRAINT 子句

SQL92 对约束声明了一些附加的功能,并且还定义了断言和域(domain)约束.
注意: Postgres 还不支持域(domain)和断言.
一个断言是一种特殊类型的完整性约束,并且和其他约束共享相同的名字空间(namespace).不过,一个断言不象约束那样必须依赖于某个基本表,所以 SQL-92 提供了一个 CREATE ASSERTION 语句作为定义约束的一个可选的手段:
CREATE ASSERTION name CHECK ( condition )
域约束是用 CREATE DOMAIN 或 ALTER DOMAIN 语句定义的:

域约束:

[ CONSTRAINT name ] CHECK constraint 
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
表约束定义:
[ CONSTRAINT name ] { PRIMARY KEY ( column, ... ) | FOREIGN KEY constraint | UNIQUE constraint | CHECK constraint }
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
列约束定义:
[ CONSTRAINT name ] { NOT NULL | PRIMARY KEY | FOREIGN KEY constraint | UNIQUE | CHECK constraint }  
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
一个 CONSTRAINT (约束)定义可以包含一个任意顺序的延迟属性的子句和/或一个初始化约束式子句.
NOT DEFERRABLE
意味着每条语句执行后都必须校验是否违反约束规则.SET CONSTRAINTS ALL DEFERRED 对这类约束没有影响.
DEFERRABLE
这个选项控制约束是否可以被推迟到事务的结束.如果使用了 SET CONSTRAINTS ALL DEFERRED 或者约束被设置成为 INITIALLY DEFERRED,将导致外键只在事务结束的时候检查.
SET CONSTRAINT 只为当前事务改变外键约束模式.
INITIALLY IMMEDIATE
只在事务结束的时候检查约束.这是缺省.
INITIALLY DEFERRED
在每条语句后检查约束.

CHECK 子句

SQL92 对 CHECK 声明了一些附加功能,不管是表约束还是列/字段约束.

表约束定义:

[ CONSTRAINT name ] CHECK ( VALUE condition ) 
      [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
      [ [ NOT ] DEFERRABLE ]
列约束定义:
[ CONSTRAINT name ] CHECK ( VALUE condition ) 
      [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
      [ [ NOT ] DEFERRABLE ]

PRIMARY KEY 子句

SQL92 为 PRIMARY KEY 声明了一些附加的功能:

表约束定义:

[ CONSTRAINT name ] PRIMARY KEY ( column [, ...] ) 
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
列约束定义:
[ CONSTRAINT name ] PRIMARY KEY 
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]