CREATE TABLE

Name

CREATE TABLE — 创建一个新表
CREATE [ TEMPORARY | TEMP ] TABLE table_name (
    { column_name type [ column_constraint [ ... ] ]
      | table_constraint }  [, ... ]
    ) [ INHERITS ( inherited_table [, ... ] ) ]

这里 column_constraint 可以是:
[ CONSTRAINT constraint_name ]
{ NOT NULL | NULL | UNIQUE | PRIMARY KEY | DEFAULT value | CHECK (condition) |
  REFERENCES table [ ( column ) ] [ MATCH FULL | MATCH PARTIAL ]
   [ ON DELETE action ] [ ON UPDATE action ]
   [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
}

而 table_constraint 可以是:
[ CONSTRAINT constraint_name ]
{ UNIQUE ( column_name [, ... ] ) |
  PRIMARY KEY ( column_name [, ... ] ) |
  CHECK ( condition ) |
  FOREIGN KEY ( column_name [, ... ] ) REFERENCES table [ ( column [, ... ] ) ]
   [ MATCH FULL | MATCH PARTIAL ] [ ON DELETE action ] [ ON UPDATE action ]
   [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
}
  

输入

TEMPORARY 或 TEMP

如果声明了这个参数,那么 此表只是为这次会话创建,并且在会话结束后自动删除。 当临时表存在时,同名的永久表(在本次会话中)是不可见的。 任何在临时表上创建的索引也自动的是临时的.

table_name

将要创建的新表的名称.

column_name

在这个新表中要创建的列/字段名.

type

列/字段类型.这里可以包括数组的声明.请参考 PostgreSQL 用户手册 获取关于数据类型和数组的详细信息.

inherited_table

可选的 INHERITS 子句声明一个表名字列表,而这个表从这些表中 自动继承所有字段.如果有任何继承过来的字段名字出现次数多于一次, 那么 Postgres 报告一个错误. Postgres 自动地允许所创建的表继承所有其祖先表的函数.

constraint_name

一个字段或表约束的可选的名字.如果没有声明,系统生成一个.

value

一个列/字段的缺省值.请参考 DEFAULT 子句获取更多信息.

condition

CHECK 子句声明完整性约束或者检查一些新行或更新行在插入和更新操作时 要想成功必须满足的条件.每个约束都必须是一个生成一个布尔变量的表达式. 一个在某字段里出现的条件应该只引用该字段的数值,而一个作为表约束 出现的条件可以引用多个字段.

table

被一个外键约束引用的现存表的名字.

column

被一个外键约束引用的现存的表的字段名字.如果没有声明,则假设是 该表的主键.

action

一个关键字,声明在违反外键约束的时候要执行的动作.

输出

CREATE

成功创建表后的返回信息.

ERROR

如果创建表失败,返回此信息.通常还跟随一些描述文本,例如: ERROR: Relation 'table' already exists 在运行时出现,因为所声明的表已经在数据库中存在.

描述

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

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

注意: 一个属性内的数组维数的一致性不是强制的。这一点在以后的版本中可能将改变。

CREATE TABLE 还自动创建一个代表元组类型(结构类型) 的数据类型,该类型对应该表的一行.因此,表不能和任何现存数据类型同名.

可选的 INHERITS 子句声明一个表集合, 所创建的表自动从这个表集合里的表继承所有字段。 如果任何继承的字段出现 次数多于一次,Postgres 报告一个错误。 Postgres 自动允许所创建的表继承那些在继承分级中级别比它高的表的函数。函 数的继承是根据公共 Lisp 对象系统 (Common Lisp Object System (CLOS))的习惯进行的。

新表将作为一个没有初始值的堆创建.一个表可以有不超过1600 (实际上,因为受字段大小限制,实际的上限还要低)列, 一个表不能和系统表同名.

DEFAULT 子句

DEFAULT value
   

DEFAULT 子句向某字段赋一个初始值,该字段就是这个定义出现的字段. 其值可以是任意生成变量的表达式. (请注意还不支持子查询和对本表其它字段的交叉引用). 缺省值的类型必须和列/字段定义的数据类型.

如果在 INSERT 操作中没有声明该字段的数值, 那么将使用 DEFAULT 表达式的值. 如果没有 DEFAULT 子句,则缺省是 NULL.

用法

CREATE TABLE distributors (
    name     VARCHAR(40) DEFAULT 'luso films',
    did      INTEGER  DEFAULT NEXTVAL('distributors_serial'),
    modtime  TIMESTAMP DEFAULT now()
);
    
上面的东西给字段 name 赋与了一个文本常量缺省值, 并且给字段 did 安排了一个缺省值,该值是从一个序列 对象中选出的下一个值得出的.modtime 的缺省值将是 该行插入的时间.

有一点值得我们指出的是

    modtime  TIMESTAMP DEFAULT 'now'
    
生成的结果可能不是我们想要的:字串 'now' 将被立即转换成一个 timestamp 值,因此 modtime 的缺省值将总是表创建的时间.我们可以通过把缺省值声明为一个函数 调用来避免这种困难.

列/字段 CONSTRAINT 子句

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

输入

constraint_name

赋予整个约束的任意名称.

NULL

列允许包含 NULL 值。这是缺省值。

NOT NULL

列不允许包含 NULL 值.与包含 CHECK 的列/字段相同 CHECK (column NOT NULL).

UNIQUE

列/字段必须有一个唯一值.在 Postgres 这是通过在表上隐含地创建一个唯一索引实现的.

PRIMARY KEY

本列是一个主键, 暗示着其唯一性是由系统强制提供的而且其他表可能依赖此列/字段作为 唯一的行标识. PRIMARY KEY 蕴涵 UNIQUE 和 NOT NULL 约束. 请参考 PRIMARY KEY 获取更多的信息.

condition

任意布尔值约束条件.

描述

可选的约束子句声明某种约束或者测试,当进行插入或者更新操作时, 新的或者更新的元组必须满足这个约束或测试时操作才能成功。

约束是一个命名的规则:它是一个 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 constraint_name ] UNIQUE
   

输入

constraint_name

赋予一个约束子句的任意名字.

Outputs

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 获取更多信息.

用法

为表 name 字段 定义一个 UNIQUE 约束:

CREATE TABLE distributors (
    did      DECIMAL(3),
    name     VARCHAR(40) UNIQUE
);
  
与下面的表约束相同:
CREATE TABLE distributors (
    did      DECIMAL(3),
    name     VARCHAR(40),
    UNIQUE(name)
);
     

CHECK (检查)约束

[ CONSTRAINT constraint_name ] CHECK ( condition )
   

输入

constraint_name

赋予约束的任意名称.

condition

任何产生一个布尔值的有效的条件表达式.

输出

status

ERROR: ExecAppend: rejected due to CHECK constraint "constraint_name".

此错误发生在运行时, 如果试图向列/字段中插入一个违反 CHECK 约束的非法数值.

描述

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

CHECK 声明一个涉及到一个表中一个或多个字段的一般的布尔表达失. 如果给某行的这些字段提供的数值经这个表达式计算出 FALSE,那么 该新行将被拒绝.

目前,CHECK 表达式不能包含子查询,也不能引用除了当前行里的字段之外的 其它变量.

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

PRIMARY KEY (主键)约束

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

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

描述

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

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

注意

目前 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 ]
   

输出

constraint_name

完整性约束的任意名称.

column [, ... ]

用于定义唯一索引,或 PRIMARY KEY,或 NOT NULL 约束的列/字段名.

CHECK ( constraint )

要作为约束进行估值的布尔表达式.

输出

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

描述

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

UNIQUE
CHECK
PRIMARY KEY
FOREIGN KEY

UNIQUE 约束

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

输入

constraint_name

赋予约束的任意名称.

column

某表中的列/字段名.

输出

status

ERROR: Cannot insert a duplicate key into a unique index

如果试图向列中插入一个重复的值,将发生此运行时错误.

描述

UNIQUE 约束表明这样一条规则: 表中由一个或若干个独立的列/字段组成的集合只能包含唯一的数值. 表的 UNIQUE 约束和对应的列/字段约束的行为是一样的, 区别是表约束可以跨越多个列/字段.

请参考列/字段的 UNIQUE 约束获取更多细节.

用法

避免表 distributors 中的重复行:

CREATE TABLE distributors (
    did      DECIMAL(3),
    name     VARCHAR(40),
    UNIQUE(did,name)
);
     

PRIMARY KEY 约束

[ CONSTRAINT 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 constraint_name ] FOREIGN KEY ( column [, ... ] )
    REFERENCES reftable [ ( refcolumn [, ... ] ) ] 
    [ MATCH matchtype ]
    [ ON DELETE action ] 
    [ ON UPDATE action ]
    [ [ NOT ] DEFERRABLE ]
    [ INITIALLY checktime ]
   

REFERENCES (参考)约束声明了一个规则:一个字段 或者一套字段的数值要与另外一个表的 数值做对比检查.

输入

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(3) 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(3),
    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(5),
    title     VARCHAR(40),
    did       DECIMAL(3),
    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(3),
    name     CHAR VARYING(40),
    PRIMARY KEY(did)
); 
   
CREATE TABLE distributors (
    did      DECIMAL(3) PRIMARY KEY,
    name     VARCHAR(40)
);
   

兼容性

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 GLOBAL TEMPORARY TABLE 语句定义一个其他客户端可见的新表和定义表的列/字段和约束。

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

UNIQUE 子句

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

表约束定义:

[ CONSTRAINT constraint_name ] UNIQUE ( column [, ... ] )
    [ { INITIALLY DEFERRED | INITIALLY IMMEDIATE } ]
    [ [ NOT ] DEFERRABLE ]
     

列/字段约束定义:

[ CONSTRAINT constraint_name ] UNIQUE
      [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
      [ [ NOT ] DEFERRABLE ]
     

NULL 子句

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

[ CONSTRAINT constraint_name ] NULL 
     

NOT NULL 子句

SQL92 对 NOT NULL 声明了一些附加的功能:

[ CONSTRAINT constraint_name ] NOT NULL 
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
     

CONSTRAINT 子句

SQL92 对约束声明了一些附加的功能,并且还定义了断言和域(domain)约束.

Note: Postgres 还不支持域(domain)和断言.

一个断言是一种特殊类型的完整性约束, 并且和其他约束共享相同的名字空间(namespace). 不过,一个断言不象约束那样必须依赖于某个基本表, 所以 SQL-92 提供了一个 CREATE ASSERTION 语句作为定义约束的一个可选的手段:

CREATE ASSERTION name CHECK ( condition )
    

域约束是用 CREATE DOMAIN 或 ALTER DOMAIN 语句定义的:

域约束:

[ CONSTRAINT constraint_name ] CHECK constraint 
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
     

表约束定义:

[ CONSTRAINT constraint_name ] { PRIMARY KEY ( column, ... ) | FOREIGN KEY constraint | UNIQUE constraint | CHECK constraint }
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
     

列约束定义:

[ CONSTRAINT 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 constraint_name ] CHECK ( VALUE condition ) 
      [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
      [ [ NOT ] DEFERRABLE ]
     

列约束定义:

[ CONSTRAINT constraint_name ] CHECK ( VALUE condition ) 
      [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
      [ [ NOT ] DEFERRABLE ]
    

PRIMARY KEY 子句

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

表约束定义:

[ CONSTRAINT constraint_name ] PRIMARY KEY ( column [, ... ] ) 
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
     

列约束定义:

[ CONSTRAINT constraint_name ] PRIMARY KEY 
    [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
    [ [ NOT ] DEFERRABLE ]
     

继承

通过 INHERITS 子句进行多重继承是一个 Postgres 语言扩展.SQL99(但不是 SQL92)使用了一个不同的语法和不同的语义 定义了单继承.SQL99 风格的继承还不被 Postgres 支持.