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 ] }
如果声明了这个参数,那么 此表只是为这次会话创建,并且在会话结束后自动删除。 当临时表存在时,同名的永久表(在本次会话中)是不可见的。 任何在临时表上创建的索引也自动的是临时的.
将要创建的新表的名称.
在这个新表中要创建的列/字段名.
列/字段类型.这里可以包括数组的声明.请参考 PostgreSQL 用户手册 获取关于数据类型和数组的详细信息.
可选的 INHERITS 子句声明一个表名字列表,而这个表从这些表中 自动继承所有字段.如果有任何继承过来的字段名字出现次数多于一次, 那么 Postgres 报告一个错误. Postgres 自动地允许所创建的表继承所有其祖先表的函数.
一个字段或表约束的可选的名字.如果没有声明,系统生成一个.
一个列/字段的缺省值.请参考 DEFAULT 子句获取更多信息.
CHECK 子句声明完整性约束或者检查一些新行或更新行在插入和更新操作时 要想成功必须满足的条件.每个约束都必须是一个生成一个布尔变量的表达式. 一个在某字段里出现的条件应该只引用该字段的数值,而一个作为表约束 出现的条件可以引用多个字段.
被一个外键约束引用的现存表的名字.
被一个外键约束引用的现存的表的字段名字.如果没有声明,则假设是 该表的主键.
一个关键字,声明在违反外键约束的时候要执行的动作.
CREATE TABLE 将向当前数据库中追加一个表. 表将为执行命令者"所有".
每个 type 可以是简单类型,复合(集合)类型或者一个数组类型。 每个属性都可以声明为非空并且每个都可以有一个缺省值,用 DEFAULT 子句 声明。
注意: 一个属性内的数组维数的一致性不是强制的。这一点在以后的版本中可能将改变。
CREATE TABLE 还自动创建一个代表元组类型(结构类型) 的数据类型,该类型对应该表的一行.因此,表不能和任何现存数据类型同名.
可选的 INHERITS 子句声明一个表集合, 所创建的表自动从这个表集合里的表继承所有字段。 如果任何继承的字段出现 次数多于一次,Postgres 报告一个错误。 Postgres 自动允许所创建的表继承那些在继承分级中级别比它高的表的函数。函 数的继承是根据公共 Lisp 对象系统 (Common Lisp Object System (CLOS))的习惯进行的。
新表将作为一个没有初始值的堆创建.一个表可以有不超过1600 (实际上,因为受字段大小限制,实际的上限还要低)列, 一个表不能和系统表同名.
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_name ] { NULL | NOT NULL | UNIQUE | PRIMARY KEY | CHECK condition | REFERENCES reftable [ ( refcolumn ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] [ [ NOT ] DEFERRABLE ] [ INITIALLY checktime ] }
赋予整个约束的任意名称.
列允许包含 NULL 值。这是缺省值。
列不允许包含 NULL 值.与包含 CHECK 的列/字段相同 CHECK (column NOT NULL).
列/字段必须有一个唯一值.在 Postgres 这是通过在表上隐含地创建一个唯一索引实现的.
本列是一个主键, 暗示着其唯一性是由系统强制提供的而且其他表可能依赖此列/字段作为 唯一的行标识. PRIMARY KEY 蕴涵 UNIQUE 和 NOT NULL 约束. 请参考 PRIMARY KEY 获取更多的信息.
任意布尔值约束条件.
可选的约束子句声明某种约束或者测试,当进行插入或者更新操作时, 新的或者更新的元组必须满足这个约束或测试时操作才能成功。
约束是一个命名的规则:它是一个 SQL 对象,它通过对 INSERT, UPDATE 或 DELETE 等对基本表的操作结果进行限 制,进而可以获得有效的结果集.
有两种方法定义完整性约束:表约束(随后提到), 列/字段约束(将在这里说明).
一个列/字段约束是作为列定义的一部分定义的一个整合约束, 而且逻辑上一旦创建就会成为表约束.可用的列约束:
PRIMARY KEY |
REFERENCES |
UNIQUE |
CHECK |
NOT NULL |
[ CONSTRAINT name ] NOT NULL
NOT NULL 约束表明一个列只能包含非空(non-null)数值的规则. NOT NULL 约束只是一个列约束,不允许作为一个表约束.
[ CONSTRAINT constraint_name ] UNIQUE
如果试图向列/字段中插入一个重复数值,返回此运行时错误.
UNIQUE 约束表明一个这样的规则: 表中一组由一个或多个独立列组成的集合中只能包含一个唯一的数值.
一个列/字段定义包含了 UNIQUE 约束,不一定要包含 NOT NULL 约束. 在一个没有NOT NULL 约束的列/字段列如果有多个空值并不违反 UNIQUE 约束. (这与 SQL92 定义不一致,但却是更有意义的习惯. 请参阅兼容性部分获取更多细节.)
每个 UNIQUE 列约束必须赋予一个该表中没有被其他 UNIQUE 或 PRIMARY KEY 约束定义过的列/字段上.
注意: Postgres 自动为每个 UNIQUE 约束创建 一个唯一索引,以保证数据完整性. 请参阅 CREATE INDEX 获取更多信息.
[ CONSTRAINT constraint_name ] CHECK ( condition )
[ CONSTRAINT constraint_name ] PRIMARY KEY
当你试图向一个有 PRIMARY KEY 约束的列插入一个重复的数值时, 将返回这个运行时信息.
[ CONSTRAINT constraint_name ] REFERENCES reftable [ ( refcolumn ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] [ [ NOT ] DEFERRABLE ] [ INITIALLY checktime ]
REFERENCES (参考)约束声明了一个规则: 一个字段的数值要与另外一个字段的数值做对比检查. REFERENCES 还 可以做为一个 FOREIGN KEY 表约束的一部分声明.
约束的任意名称.
包含对比检查数据的表的名称.
reftable 里要做对比检查的字段名称.如果没有声明,使用表 reftable 的 PRIMARY KEY.
有三种匹配类型:MATCH FULL,MATCH PARTIAL 和一种缺省的匹配类型 (如果什么都没有声明的话). 除非所有的外键字段都是 NULL, 否则 MATCH FULL 将不允许一个多列/字段外键的某个列为 NULL.缺省的 MATCH 类型是允许某些外键字段是 NULL 而其他部分的外键字段不是 NULL. MATCH PARTIAL 目前不支持.
当一个被参考表里的被参考行要删除时,要处理的动作.有下列动作.
如果违反外键则产生错误.这是缺省.
与 NO ACTION 相同.
删除任何引用参考行的行.
把参考列的值设为 NULL.
把参考列的值设置为它们的缺省值.
当一个参考表里的参考列要被更新时,要处理的动作. 如果行被更新而参考列没有改变,不发生任何动作.有下面动作.
如果违反外键则产生错误.这是缺省.
与 NO ACTION 相同.
把参考列的值更新为被参考列的新值.
把参考列的值设置为 NULL.
把参考列的值设置为缺省值.
这个选项控制该约束是否可以推迟到事务的结尾. 如果 DEFERRABLE,SET CONSTRAINTS ALL DEFERRED 将导致只是在事务的结束时才检查外键. 缺省是 NOT DEFERRABLE.
checktime 有两个可能的值用以声明检查约束的缺省时间.
只在事务结尾检查约束.
在每条语句(结尾)检查约束.这是缺省.
如果某人试图把一个数值插入到一个列中, 而该列在被参考的表中没有匹配列,则生成这条运行时错误.
[ 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 ]
完整性约束的任意名称.
用于定义唯一索引,或 PRIMARY KEY,或 NOT NULL 约束的列/字段名.
要作为约束进行估值的布尔表达式.
[ CONSTRAINT constraint_name ] UNIQUE ( column [, ... ] )
[ CONSTRAINT constraint_name ] PRIMARY KEY ( column [, ... ] )
[ CONSTRAINT constraint_name ] FOREIGN KEY ( column [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] [ MATCH matchtype ] [ ON DELETE action ] [ ON UPDATE action ] [ [ NOT ] DEFERRABLE ] [ INITIALLY checktime ]
REFERENCES (参考)约束声明了一个规则:一个字段 或者一套字段的数值要与另外一个表的 数值做对比检查.
约束的任意名称.
表中的一个或者多个列的名称.
包含对比检查数据的表的名称.
reftable 里要做对比检查的一个或多个字段的名称. 如果没有声明,使用表 reftable 的 PRIMARY KEY.
有三种匹配类型:MATCH FULL,MATCH PARTIAL 和一种缺省的匹配类型 (如果什么都没有声明的话).除 非所有的外键字段都是 NULL,否则 MATCH FULL 将不允许一个多列/字段 外键的某个列为 NULL.缺省的 MATCH 类型是允许某些外键字段是 NULL 而其他部分的外键字段不是 NULL.MATCH PARTIAL 目前不支持.
当一个被参考表里的被参考行要被删除时,要处理的动作.有下列动作.
如果违反外键则产生错误.这是缺省.
与 NO ACTION 相同.
删除任何引用参考行的行.
把参考列的值设为 NULL.
把参考列的值设置为它们的缺省值.
当一个被参考表里的被参考列要更新为新数值时,要处理的动作. 如果行被更新而参考列没有改变,不发生任何动作.有下面动作.
如果违反外键则产生错误.这是缺省.
不允许被参考的列的更新.
把参考列的值更新为被参考列的新值.
把参考列的值设置为 NULL.
把参考列的值设置为缺省值.
这个选项控制该约束是否可以推迟到事务的结尾. 如果 DEFERRABLE,SET CONSTRAINTS ALL DEFERRED 将导致只是在事务的结束时才检查外键.缺省是NOT DEFERRABLE.
checktime 有两个可能的值用以声明检查约束的缺省时间.
在每条语句(结尾)检查约束.这是缺省.
只在事务结尾检查约束.
创建表 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还定义了一条 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.
SQL92 对 UNIQUE 定义了一些附加的功能.
表约束定义:
[ CONSTRAINT constraint_name ] UNIQUE ( column [, ... ] ) [ { INITIALLY DEFERRED | INITIALLY IMMEDIATE } ] [ [ NOT ] DEFERRABLE ]
列/字段约束定义:
[ CONSTRAINT constraint_name ] UNIQUE [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ]
NULL "约束" (实际上不是一个约束)是一个 Postgres 对SQL92的扩展,把它包含进来是为了和 NOT NULL 子句对称。 因为这是任何列的缺省,它的出现只是添乱。
[ CONSTRAINT constraint_name ] NULL
SQL92 对 NOT NULL 声明了一些附加的功能:
[ CONSTRAINT constraint_name ] NOT NULL [ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ] [ [ NOT ] DEFERRABLE ]
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 (约束)定义可以包含一个 任意顺序的延迟属性的子句和/或一个初始化约束式子句.
意味着每条语句执行后都必须校验是否违反约束规则. SET CONSTRAINTS ALL DEFERRED 对这类约束没有影响.
这个选项控制约束是否可以被推迟到事务的结束. 如果使用了 SET CONSTRAINTS ALL DEFERRED 或者约束被 设置成为 INITIALLY DEFERRED,将导致外键只在事务结束的时候检查.
注意: SET CONSTRAINT 只为当前事务改变外键约束模式.
在每条语句后检查约束.这是缺省.
只在事务结束的时候检查约束.
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 ]
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 ]