| PostgreSQL | ||
|---|---|---|
| 上一页 | 下一页 | |
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 [, ...] ) ]
另外: 函数的继承是按照通用Lisp对象系统(CLOS)的习惯进行的.
CREATE TABLE 将向当前数据库中追加一个表.表将为执行命令者"所有".
每个 type 可以是简单类型,复合(集)类型或者一个数组类型。每个属性都可以声明为非空并且每个都可以有一个缺省值,用 DEFAULT 子句 声明。
注意:对于 Postgres v6.0,一个属性内的数组唯数的一致性不是强制的。这一点在以后的版本中将改变。
可选的 INHERITS 子句声明一个表集合,所创建的表自动从这个表集合里的表继承所有字段。如果任何继承的字段出现次数多于一次,Postgres 报告一个错误。Postgres 自动允许所创建的表继承那些在继承分级中级别比它高的表的函数。函数的继承是根据公共 Lisp 对象系统(Common Lisp Object System (CLOS))的习惯进行的。
每个新表或表 table 自动被创建为一个类型。因此表中的一条或更多实例自动就是一个类型,因而可以用于 ALTER TABLE 或其他 CREATE TABLE 语句。
新表将作为一个没有初始值的堆创建.一个表可以有不超过1600(事实上,这是因为受字段大小必须小于8192字节的限制)列,但是这个限制在一些节点上可以通过配置降低.一个表不能和系统表同名.
DEFAULT value
无
DEFAULT 子句向某列赋一个初始值.(通过在 CREATE TABLE 语句里面定义).缺省值的类型必须和列/字段定义的数据类型.
一个 INSERT 操作如果包括一个没有缺省值的列/字段,这时如果没有显式地提供该/列字段的数据值,将用一个NULL代替.缺省的 literal 意味着缺省值是声明的常量.缺省的 niladic-function 或 user-function 意味着缺省值是在 INSERT 时声明的函数值.
有两类 (?)niladic 函数:
在当前的版本 (v6.5), Postgres 在定义表的时候就计算所有缺省表达式的值.因为这样 一些"不可缓存"的函数像 CURRENT_TIMESTAMP 可能不会产生预期的结果.对于日期/时间类型的一些特殊情况,我们可以通过使用一些手段绕过这些情况,象用 “DEFAULT TEXT 'now'” 代替 “DEFAULT 'now'” 或 “DEFAULT CURRENT_TIMESTAMP”.这就强制 Postgres 把日期/时间类型看成字符串常量然后在运行时将它们转换成(时标)timestamp 值.
给列/字段 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'
);
[ CONSTRAINT name ] { [
NULL | NOT NULL ] | UNIQUE | PRIMARY KEY | CHECK constraint } [, ...]
可选的约束子句声明某种约束或者测试,当进行插入或者更新操作时,新的或者更新的记录必须满足这个约束或测试时操作才能成功。每个约束必须得出一个布尔表达式。多个字段/属性可以在一个约束里面引用。作为表约束的 PRIMARY KEY 的使用是与作为列约束的 PRIMARY KEY 互相冲突不可兼容的。
约束是一个命名的规则:它是一个 SQL 对象,它通过对 INSERT,UPDATE 或 DELETE 等对基本表的操作结果进行限制,进而可以获得有效的结果集.
有两种方法定义整合约束:表约束(随后提到),列/字段约束(将在这里说明).
一个列/字段约束是作为列定义的一部分定义的一个整合约束,而且逻辑上一旦创建就会成为表约束.可用的列约束:
| PRIMARY KEY |
| REFERENCES |
| UNIQUE |
| CHECK |
| NOT NULL |
注意: Postgres 还不支持 (版本 6.5)REFERENCES 整合约束.分析器接受 REFERENCES 语法,但将忽略之.
[ CONSTRAINT name ] NOT NULL
NOT NULL 约束表明一个列只能包含非空(non-null)数值的规则.NOT NULL 约束只是一个列约束,不允许作为一个表约束.
在表 distributors 上定义两个(非空)NOT NULL 列约束,其中一个是命名约束:
CREATE TABLE distributors (
did DECIMAL(3) CONSTRAINT no_null NOT NULL,
name VARCHAR(40) NOT NULL
);
[ CONSTRAINT name ] UNIQUE
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)
);
[ CONSTRAINT name ] CHECK
( condition [, ...] )
CHECK 约束声明一个列中允许的数据的限制. CHECK 约束也可以做表约束.
SQL92 CHECK 列约束只能对表中的一列/字段进行定义或使用.Postgres没有这个限制.
[ CONSTRAINT name ] PRIMARY KEY
PRIMARY KEY 列约束表明表中的一个列/字段只能包含唯一的(不重复),非空的数值.在该列/字段的PRIMARY KEY 约束定义中不需要显式的包括NOT NULL 约束.
一个表只能声明一个 PRIMARY KEY.
在同一个表中 PRIMARY KEY 约束定义的列应该应该和其他定义了 UNIQUE 约束的列不同名(不是同一列).因为这会导致等价索引的重复和增加不必要的处理.然而, Postgres 并没有明文禁止这些.
[ CONSTRAINT name ] { PRIMARY KEY | UNIQUE } ( column [, ...] )
[ CONSTRAINT name ] CHECK ( constraint )
表约束子句的可能输出和对应的列/字段约束的输出一样.
表约束是对一个基本表的一个或多个列/字段定义的整合约束."表约束"的四个元素是:
| UNIQUE |
| CHECK |
| PRIMARY KEY |
| FOREIGN KEY |
注意: Postgres 目前(版本 6.5)还不支持 FOREIGN KEY 整合约束.分析器可以理解 FOREIGN KEY 语法,但只是打印一个声明或者是忽略这个子句.外部键字(Foreign keys)可以部分的用触发器防真.(参考 CREATE TRIGGER 语句).(译注:在版本7.0中已经支持外键了。Y2K-03-13)
[ CONSTRAINT name ] UNIQUE ( column [, ...] )
UNIQUE 约束表明表中由一个或若干个独立的列/字段组成的集合只能包含唯一的数值.表的 UNIQUE 约束和对应的列/字段约束的特性是一样的,区别是表约束可以跨越多个列/字段.
请参考列/字段的 UNIQUE 约束获取更多细节.
给一个表 distributors 定义一个 UNIQUE 表约束:
CREATE TABLE distributors (
did DECIMAL(03),
name VARCHAR(40),
UNIQUE(name)
);
[ CONSTRAINT name ] PRIMARY KEY ( column [, ...] )
PRIMARY KEY 约束表明某个表的由一个或多个列/字段组成的集合只能包含唯一,(不重复),非空数值.对声明的列定义的 PRIMARY KEY 约束不需要包括 NOT NULL 约束.
PRIMARY KEY 表约束与列/字段约束相似,区别是它具有控制多列/字段的能力.
请参考 PRIMARY 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还定义了一条 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;
SQL92 对 UNIQUE 定义了一些附加的功能.
表约束定义:
[ CONSTRAINT name ] 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 对约束声明了一些附加的功能,并且还定义了断言和域(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 (约束)定义可以包含一个任意顺序的延迟属性的子句和/或一个初始化约束式子句.
每个约束的约束模式总是有一个初始化缺省值,该值在事务开始时为该约束设定。
SQL92 对 CHECK 声明了一些附加功能,不管是表约束还是列/字段约束.
表约束定义:
[ CONSTRAINT name ] CHECK ( VALUE condition )
[ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
[ [ NOT ] DEFERRABLE ]
列约束定义:
[ CONSTRAINT name ] CHECK ( VALUE condition )
[ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
[ [ NOT ] DEFERRABLE ]
SQL92 为 PRIMARY KEY 声明了一些附加的功能:
表约束定义:
[ CONSTRAINT name ] PRIMARY KEY ( column [, ...] )
[ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
[ [ NOT ] DEFERRABLE ]
列约束定义:
[ CONSTRAINT name ] PRIMARY KEY
[ {INITIALLY DEFERRED | INITIALLY IMMEDIATE} ]
[ [ NOT ] DEFERRABLE ]
| 上一页 | 首页 | 下一页 |
| CREATE SEQUENCE | 开头 | CREATE TABLE AS |