|
CREATE TABLESynopsisCREATE [ [ LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name ( { column_name data_type [ DEFAULT default_expr ] [ column_constraint [, ... ] ] | table_constraint } [, ... ] ) [ INHERITS ( parent_table [, ... ] ) ] [ WITH OIDS | WITHOUT OIDS ] 这里 column_constraint 可以是: [ CONSTRAINT constraint_name ] { NOT NULL | NULL | UNIQUE | PRIMARY KEY | CHECK ( expression ) | REFERENCES reftable [ ( refcolumn ) ] [ 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 ( expression ) | FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ] [ MATCH FULL | MATCH PARTIAL ] [ ON DELETE action ] [ ON UPDATE action ] } [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] 描述CREATE TABLE 将在当前数据库创建一个新的, 初始为空的表.该表将由发出此命令的用户所有. CREATE TABLE 还自动创建一个数据类型, 该数据类型代表对应该表一行的元组类型(结构类型). 因此,表不能和一个现有数据类型同名. 一个表的字段数不能超过 1600.(实际上,真正的限制比这低, 因为还有元组长度的约束).表不能和系统表同名. 可选的约束子句声明约束(或者测试),新行或者更新的行必须满足 这些约束才能成功插入或更新.约束是一个命名的规则∶ 它是一个 SQL 对象,它通过对发生在表上的插入,更新或者删除操作 的结果进行限制来协助我们定义有效的数值集合. 定义约束又两种方法∶表约束和列约束.一个列约束是作为 一个列定义的一部分定义的.而表约束并不和某个列绑在一起, 它可以作用于多于一个列上.每个列约束也可以写成表约束; 如果某个约束只影响一个列,那么列约束只是符号上的简洁方式而已. 参数
注意
例子创建表 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 定义一个唯一表约束. 唯一表约束可以在表的一个或多个字段上定义∶ CREATE TABLE films ( code CHAR(5), title VARCHAR(40), did DECIMAL(3), date_prod DATE, kind VARCHAR(10), len INTERVAL HOUR TO MINUTE, CONSTRAINT production UNIQUE(date_prod) );
定义一个检查列约束∶ CREATE TABLE distributors ( did DECIMAL(3) CHECK (did > 100), name VARCHAR(40) );
定义一个检查表约束∶ CREATE TABLE distributors ( did DECIMAL(3), name VARCHAR(40) CONSTRAINT con1 CHECK (did > 100 AND name <> '') );
为表 films 定义一个主键表约束. 主键表约束可以定义在表上的一个或多个字段. CREATE TABLE films ( code CHAR(5), title VARCHAR(40), did DECIMAL(3), date_prod DATE, kind VARCHAR(10), len INTERVAL HOUR TO MINUTE, CONSTRAINT code_title PRIMARY KEY(code,title) );
为表 distributors 定义一个主键约束. 下面两个例子是等效的,第一个例子使用了表约束语法, 第二个使用了列约束表示法. CREATE TABLE distributors ( did DECIMAL(3), name CHAR VARYING(40), PRIMARY KEY(did) );
CREATE TABLE distributors ( did DECIMAL(3) PRIMARY KEY, name VARCHAR(40) );
下面这个例子给字段 name 赋予了一个文本常量 缺省值,并且将字段 did 的缺省值安排为 通过选择序列对象的下一个值生成. modtime 的 缺省值将是该行插入的时候的时间. CREATE TABLE distributors ( name VARCHAR(40) DEFAULT 'luso films', did INTEGER DEFAULT NEXTVAL('distributors_serial'), modtime TIMESTAMP DEFAULT CURRENT_TIMESTAMP );
在表 distributors 上定义两个 NOT NULL 列约束,其中之一明确给出了名字∶ CREATE TABLE distributors ( did DECIMAL(3) CONSTRAINT no_null NOT NULL, name VARCHAR(40) NOT NULL );
为 name 字段定义一个唯一约束∶ CREATE TABLE distributors ( did DECIMAL(3), name VARCHAR(40) UNIQUE ); 上面的和下面这样作为一个表约束声明是一样的∶ CREATE TABLE distributors ( did DECIMAL(3), name VARCHAR(40), UNIQUE(name) );
兼容性CREATE TABLE 遵循 SQL92 和 SQL99 的一个子集 的中间状态,一些例外情况在下面和上面的诊断中列出. 临时表除了局部临时表之外,SQL92 还定义了 CREATE GLOBAL TEMPORARY TABLE 语句. 全局临时表也可以在其它会话中可见. 对于临时表,有一个可选的 ON COMMIT 子句∶ CREATE { GLOBAL | LOCAL } TEMPORARY TABLE table ( ... ) [ ON COMMIT { DELETE | PRESERVE } ROWS ] ON COMMIT 子句表明该临时表在执行 COMMIT 的时候是否应该清空行. 如果省略了 ON OMMIT 子句,SQL92 声明缺省是 ON COMMIT DELETE ROWS .不过, PostgreSQL 的行为总是类似 ON COMMIT PRESERVE ROWS . NULL "约束"NULL "约束" (实际上不是约束) 是 PostgreSQL 对 SQL92 的扩展, 包括它是为了和其它一些 RDBMS 兼容(以及为了和 NOT NULL 约束对称).因为它是任何字段的缺省,所以它的出现只是噪音而已. 断言断言是一种特殊类型的完整性约束,它和其它约束共享相同的名字空间. 不过,断言和约束不同的是,它不一定依赖于某个特定的表,因此 SQL92 提供了 CREATE ASSERTION 语句作为定义 约束的一个可选的方法∶ CREATE ASSERTION name CHECK ( condition )
PostgreSQL 目前还没有实现断言. |