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 会自动让新表继承其在继承层次 中上方表上的函数。
函数的继承按照 Common Lisp Object System(CLOS)的惯例进行。
CREATE表创建成功时返回的消息。
ERROR表创建失败时返回的消息。通常还伴随一些描述性文字,例如: ERROR: Relation ' ,如果指定的表在数据库中已存在,就会在运行时出现该错误。table' already exists
ERROR: DEFAULT: type mismatched如果默认值的数据类型与列定义的数据类型不匹配。
CREATE TABLE 将向当前数据库中输入一个新表。 该表将由发出命令的用户“拥有”。
新表作为堆创建,不含初始数据。一个表最多可以有 1600 列(现实中, 由于元组大小必须小于 8192 字节,这个上限还会更低),某些站点还可能 把该上限配置得更低。表不能与系统目录表同名。
DEFAULT value
value默认值表达式可能的取值有:
无。
DEFAULT 子句为一个列指定默认数据值(通过 CREATE TABLE 语句中的 列定义)。默认值的数据类型必须与列定义的数据类型匹配。
如果一个 INSERT 操作涉及的列没有指定默认值,且没有为它提供显式 数据值,那么将把 NULL 值赋给该列。Default literal 表示默认值就是指定的常量值。Default 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'
);
[ CONSTRAINTname] { [ NULL | NOT NULL ] | UNIQUE | PRIMARY KEY | CHECKconstraint} [, ...]
name赋予完整性约束的一个任意名称。如果未指定 name,它将由表名和列名 生成,这应当能保证 name 的唯一性。
该列允许包含 NULL 值。这是默认情况。
该列不允许包含 NULL 值。这等价于列约束 CHECK (column NOT NULL)。
该列必须具有唯一值。在 Postgres 中,这是通过在表上隐式创建一个唯一索引来强制实现的。
该列是一个主键,这蕴含着唯一性由系统强制,并且其他表可以把该列 当作行的唯一标识符来依赖。详见 PRIMARY KEY。
constraint约束的定义。
约束是一条命名的规则:一个通过对在基表上执行的 INSERT、UPDATE 或 DELETE 操作的结果加以限制,来帮助定义有效值集合的 SQL 对象。
定义完整性约束有两种方式:稍后讲述的表约束,以及这里讲述的列约束。
列约束是作为列定义的一部分定义的完整性约束,一旦创建,在逻辑上就 成为表约束。可用的列约束有:
| PRIMARY KEY |
| REFERENCES |
| UNIQUE |
| CHECK |
| NOT NULL |
Postgres 在 6.5 版中尚不支持 REFERENCES 完整性约束。解析器接受 REFERENCES 语法,但忽略该子句。
[ 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 并不特别禁止这样做。
[ CONSTRAINT name ] { PRIMARY KEY | UNIQUE } ( column [, ...] )
[ CONSTRAINT name ] CHECK ( constraint )
name赋予完整性约束的一个任意名称。
column [, ...]要为其定义唯一索引的列名,对于 PRIMARY KEY 还要加 NOT NULL 约束。
constraint )一个将被作为约束求值的布尔表达式。
表约束子句可能的输出与列约束子句相应部分的输出相同。
表约束是定义在一个基表的一列或多列上的完整性约束。 “表约束”的四种变体是:
| UNIQUE |
| CHECK |
| PRIMARY KEY |
| FOREIGN KEY |
Postgres 在 6.5 版中尚不支持 FOREIGN KEY 完整性约束。解析器理解 FOREIGN KEY 语法,但只打印一条 提示,此外便忽略该子句。外键可以用触发器部分模拟 (见 CREATE TRIGGER 语句)。
[ CONSTRAINTname] UNIQUE (column[, ...] )
name赋予完整性约束的一个任意名称。
column表中某一列的名称。
status如果试图向一个列插入重复值,就会在运行时出现该错误。
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 列约束一节。
创建表 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 指定了一些额外的能力:
表约束定义:
[ 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 为约束指定了一些额外的能力,并且还定义了断言和域约束。
Postgres 尚不支持域和断言。
断言是一种特殊类型的完整性约束,与其他约束共享同一名字空间。不过, 断言不一定像约束那样依赖于某个特定的基表,因此 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 定义可以按任意顺序包含一个可推迟性属性子句和/或 一个初始约束模式子句。
表示该约束必须在每条 SQL 语句执行之后就检查是否违反其规则。
表示对该约束的检查可以推迟到稍后的时间,但不晚于当前事务结束。
每个约束的约束模式总是有一个初始默认值,它在事务开始时为该约束设置。
表示从事务开始起,该约束必须在每条 SQL 语句执行之后就检查 是否违反其规则。
表示从事务开始起,对该约束的检查可以推迟到稍后的时间,但不晚于当前事务结束。
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 ]
译文有误、术语不当或页面显示问题,请到译文仓库 pgsty/pgdoc 报告译文问题。 英文原文本身的问题,请在当前版本的对应页面向上游反馈;上游不再修订已结束维护的版本。