Provided by:
manpages-zh_1.5-1_all 
NAME
CREATE TABLE - 定義一虓s表
SYNOPSIS
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name (
{ column_name data_type [ DEFAULT default_expr ] [ column_constraint [, ... ] ]
| table_constraint
| LIKE parent_table [ { INCLUDING | EXCLUDING } DEFAULTS ] } [, ... ]
)
[ INHERITS ( parent_table [, ... ] ) ]
[ WITH OIDS | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
where column_constraint is:
[ CONSTRAINT constraint_name ]
{ NOT NULL | NULL | UNIQUE | PRIMARY KEY |
CHECK (expression) |
REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
[ ON DELETE action ] [ ON UPDATE action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
and table_constraint is:
[ CONSTRAINT constraint_name ]
{ UNIQUE ( column_name [, ... ] ) |
PRIMARY KEY ( column_name [, ... ] ) |
CHECK ( expression ) |
FOREIGN KEY ( column_name [, ... ] ) REFERENCES reftable [ ( refcolumn [, ... ] ) ]
[ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
DESCRIPTIONyz
CREATE TABLE 將在當前數據庫創建一虓s的,
初始為空的表。該表將由發出此命令的使用者所有。
如果給出了模式名(比如,CREATE TABLE myschema.mytable ...),
那麼表是在指定模式中創建的。否則它在當前模式中創建。臨時表存在於一-
荅S殊的模式裏, 因此創建臨時表的時-
啎ㄞ鉞馴X模式名。表名字必需和同一模式中其他表,序列,索引或者視圖相區別。
CREATE TABLE 還自動創建一蚍矞型,
該數據類型代表對應該表一行的復合類型。
因此,表不能和同模式中的現有數據類型同名。
一茠磲漲r段數不能超過 1600。(實際上,真正的-
制比這低,因為還有元組長度的約束)。
可選的約束子句聲明約束(或者測試),新行或者更新的行必須滿足這些約束才能成功插入或更新。
約束是一茈收O一 SQL 對象,它以多種方式協助我怢顜U我-
怞b表上定義有效的數隻X。
定義約束又兩種方法:表約束和列約束。一茼C約束是作為一-
茼C定義的一部分定義的。 而表約束並不和某茼C綁在一起,
它可以作用於多於一茼C上。每茼C約束也可以寫成表約束; 如果某-
茯蠽竷u影響一茼C,那麼列約束只是符號上的簡潔方式而已。
PARAMETERS數
TEMPORARY TEMP
如果聲明了此參數,則該表創建為臨時表。臨時表在會話結束時自動刪除,
或者是(可選)在當前事務的結尾(參閱下悸 ON COMMIT)。
現有同名永久表在臨時表存在期間在本會話過程中是不可見的, 除非它-
怓O用模式袡◥漲W字引用的。
任何在臨時表上創建的索引也都會自動刪除。
我怚i以選擇在 TEMPORARY 或 TEMP 前惟韙W GLOBAL 或者 LOCAL。
這樣對 PostgreSQL 沒有任何區別,可以參閱 Compatibility
[create_table(7)]。
table_name
n創建的表的名字(可以用模式袡╮^。
column_name
在新表中n創建的字段名字。
data_type
該字段的數據類型。它可以包括數組說明符。
DEFAULT
DEFAULT 子句給它所出現的字段一蚢w設數C 該數-
i以是任何不含變量的表達式(不允許使用子查詢和對本表中的其它字段的交叉引用)。
預設表達式的數據類型必須和字段類型匹配。
預設表達式將被用於任何未聲明該字段數煽﹞J操作。
如果字段上沒有預設A那麼預設是 NULL。
LIKE 子句聲明一茠瞴A新表自動從這茠薋堭繼承所有字段名, 他-
怐獐矞型,以及非空約束。
和 INHERITS
不同,新表與繼承過來的表之間在創建動作完畢之後是完全無關的。
插入新表的數據不會在父表中表現出來。
字段預設表達式只有在聲明了 INCLUDING DEFAULTS
之後才會繼承過來。 預設是排除預設表達式。
INHERITS ( parent_table [, ... ] )
可選的 INHERITS 子句聲明一列表,這-
虓s表自動從這列表中繼承所有字段。 如果在多於一-
茪鱆矰丹s在同名的字段,那麼就會報告一-
蚇欞~,除非這些字段的數據類型在每茪鱆薋堻ㄛO匹配的。
如果沒有沖突,那麼契_的字段在新表中融合成一茼r段。
如果新表的字段名列表中包括和繼承的字段同名的,那麼它的數據類型也必須和上-
惜@樣與繼承字段匹配,並且這些字段定義會融合成一荂C
不過,同名的繼承和新字段聲明可以聲明不同的約束:所有的繼承過來的約束以及聲明的約束都融合到一起,並且全部應用於新表。
如果新表為該字段明確的聲明了一蚢w設數A那麼此預設數-
郅\任何來自繼承字段聲明的預設C
否則,任何為該字段聲明了預設數-
漱鱆穖ㄔ眸溥n明相同的預設,否則就會報告一蚇欞~。
WITH OIDS
WITHOUT OIDS
這茈i選的子句聲明新表中的行是否應該擁有賦予它怐 OID
(對象標識)。 預設是有 OID。(如果新表從任何有 OID
的表繼承而來,那麼就算這條命令說了 WITHOUT OIDS, 也會強制 WITH
OIDS。)
聲明 WITHOUT OIDS 允許使用者禁止為行或者表生成 OID。
這麼做對大表是o的,因為這樣可以減少 OID 消耗並且推遲 32 位 OID
p數器的消耗。 一旦該p數器宣|,那麼就不能再假設 OID
的唯一,這樣它的實用性就大打折扣。 聲明 WITHOUT OIDS
還會減少在磁碟上存儲每行的空間,每行減少 4
字節,因此也可以改進性能。
CONSTRAINT constraint_name
列或表約束的可選名字。如果沒有聲明,則由系統生成一茼W字。
NOT NULL
字段不允許包含 NULL 數C
NULL 該字段允許包含 NULL 數C這是預設。
這茪l句的存在只是為和那些非標準 SQL 數據庫相容。 我-
怳ㄚ媊釵b新應用中使用它。
UNIQUE (column constraint)
UNIQUE ( column_name [, ... ] ) (table constraint)
UNIQUE 聲明一茬W則,表示一茠薋堛漱@茤峈怞h-
蚇W立的字段組合的分組只能包含唯一的數C
表的唯一約束的行為和列約束的一樣,只不過多了跨多行的能力。
對於唯一約束的用途而言,系統認為 NULL 數O不相等的。
每荌艉@表約束都必須命名一-
茼r段的集合,該集合必須和其它唯一約束命名字段集合或者該表定義的主鍵約束不同。
(否則就只是同樣的約束寫了兩次。)
PRIMARY KEY (column constraint)
PRIMARY KEY ( column_name [, ... ] ) (table constraint)
主鍵約束表明表中的一茤峈怳@些字段只能包含唯一(不契_)非 NULL
的數C 從技術上講,PRIMARY KEY 只是 UNIQUE 和 NOT NULL
的組合,不過把一套字段標識為主鍵同時也體現了模式設p的元數據,
因為主鍵意味著其它表可以拿這套字段用做行的唯一標識。
一茠磳u能聲明一茈D鍵,不管是作為字段約束還是表約束。
主鍵約束應該定義在同茠矰W的一-
蚖P其它唯一約束所定義的不同的字段集合上。
CHECK (expression)
CHECK 約束聲明一茈穻言牯葭痕G的子句, 一次插入或者更新操作-
Y想成功則裏悸熒s行或者被更新的行必須滿足這荓囓鞳C
聲明為字段約束的檢查約束應該只引用該字段的數-
A而在表約束裏出現的表達式可以引用多茼r段。
目前,CHECK
表達式不能包含子查詢也不能引用除當前行字段之外的變量。
REFERENCES reftable [ ( refcolumn ) ] [ MATCH matchtype ] [ ON DELETE
action ] [ ON UPDATE action ] (column constraint)
FOREIGN KEY ( column [, ... ] )
這些子句聲明一茈~鍵約束,外鍵約束聲明一-
茈挶s表中一列或者多列組成的組應該只包含匹配引用的表 reftable
中對應引用的字段 refcolumn 中的數C 如果省略 refcolumn, 則使用
reftable 的主鍵。 被引用字段必須是被引用表中的唯一字段或者主鍵。
向這些字段插入的數-
N使用給出的匹配類型與參考表中的參考列中的數i行匹配。
有三種匹配類型:MATCH FULL, MATCH PARTIAL,和 MATCH
SIMPLE,它也是預設匹配類型。 MATCH FULL 將不允許一-
茼h字段外鍵的字段為 NULL,除非所有外鍵字段都為 NULL。 MATCH
SIMPLE 允許某些外鍵字段為 NULL 而外鍵的其它部分不是 NULL。MATCH
PARTIAL 還沒實現。
另外,當被參考字段中的數據改變的時-
唌A那麼將對本表的字段中的數據執行某種操作。 ON DELETE
子句聲明當被參考表中的被參考行將被刪除的時勓執行的操作。
類似,ON UPDATE 子句聲明被參考表中被參考字段更新為新漁尕-
n執行的動作。
如果該行被更新,但被參考的字段實際上沒有變化,那麼就不會有任何動作。
下惇O每茪l句的可能的動作:
NO ACTION
生成一蚇欞~,表明刪除或者更新將產生一-
蚢H反外鍵約束的動作。 它是預設動作。
RESTRICT
和 NO ACTION 一樣,只是動作不可推遲,
即使約束剩下的部分是可以推遲的也馬上發生。
CASCADE
刪除任何引用了被刪除行的行,或者分別把引用行的字段-
騝s為被參考字段的新數C
SET NULL
把引用行數]置為 NULL。
SET DEFAULT
把引用列的數]置為它怐犒w設C
如果主鍵字段經常更新,那麼我拑 REFERENCES 字段增加一-
荅薑犍i能是合適的,這樣與 REFERENCES 字段相關聯的 NO ACTION 和 CASCADE
動作可以更有效地執行。
DEFERRABLE
NOT DEFERRABLE
這兩蚚鶬鉿r設置該約束是否可推遲。一-
茪ㄔi推遲的約束將在每條命令之後馬上檢查。
可以推遲的約束檢查可以推遲到事務結尾(使用 SET CONSTRAINTS
[set_constraints(7)] 命令)。 預設是 NOT
DEFERRABLE。目前只有外鍵約束接受這-
茪l句。所有其它約束類型都是不可推遲的。
INITIALLY IMMEDIATE
INITIALLY DEFERRED
如果約束是可推遲的,那麼這茪l句聲明檢查約束的預設時間。
如果約束是 INITIALLY IMMEDIATE, 那麼每條語句之後就檢查它。這-
茯O預設。如果約束是 INITIALLY
DEFERRED,那麼只有在事務結尾才檢查它。 約束檢查的時間可以用 SET
CONSTRAINTS [set_constraints(7)] 命令蚹鵅C
ON COMMIT
我怚i以用 ON COMMIT 控制臨時表在事務塊結尾的行為。這三蚇龠筋O:
PRESERVE ROWS
在事務結尾不發生任何特定的動作。這是預設行為。
DELETE ROWS
臨時表的所有行在每次事務結尾都被刪除。實際上,在每次提交的時-
堀ㄕ菾 truncate(7) 。
DROP 在當前事務塊的結尾,臨時表將被刪除。
NOTES`N
o 如果一蚗野峔洏峇F OID 標識表中的特定行,那麼我怮媊釵b該表的 oid
字段上創建一荌艉@約束,以確保該表的 OID 即使在p數器-
宣|之後也是唯一的。如果你需n一蚞蒑數據庫S圍的唯一標識, 那麼就-
n避免假設 OID 是跨表唯一的,你可以用 tableoid 和行 OID
的組合來實現這茈堛滿C (將來的 PostgreSQL 很可能為每茠磻洏怷W立的 OID
p數器, 因此包括 tableoid 組成數據庫-
S圍內的唯一標識將是必須的,而不是可選的。)
: 對那些沒有主鍵的表,我怳ㄚ媊釣洏 WITHOUT OIDS, 因為如果既沒有
OID 又沒有唯一數據鍵字,那麼就很難標識特定的行。
o PostgreSQL 自動為每荌艉@約束和主鍵約束創建一荅薑犍H確保唯一性。
因此,我怳ㄔ痊陞D鍵字段創建明確的索引。(參閱 CREATE INDEX
[create_index(7)]獲取更多信息。)
o 唯一約束和主鍵在目前的實現裏是不能繼承的。
這樣,如果把繼承和唯一約束組合在一起會導P無法運轉。
EXAMPLESl
創建表 films 和 distributors:
CREATE TABLE films (
code char(5) CONSTRAINT firstkey PRIMARY KEY,
title varchar(40) NOT NULL,
did integer NOT NULL,
date_prod date,
kind varchar(10),
len interval hour to minute
);
CREATE TABLE distributors (
did integer PRIMARY KEY DEFAULT nextval('serial'),
name varchar(40) NOT NULL CHECK (name <> '')
);
創建一荓a有 2 維數組的表:
CREATE TABLE array (
vector int[][]
);
為表 films 定義一荌艉@表約束。 唯一表約束可以在表的一茤峖h-
茼r段上定義:
CREATE TABLE films (
code char(5),
title varchar(40),
did integer,
date_prod date,
kind varchar(10),
len interval hour to minute,
CONSTRAINT production UNIQUE(date_prod)
);
定義一蚗邠d列約束:
CREATE TABLE distributors (
did integer CHECK (did > 100),
name varchar(40)
);
定義一蚗邠d表約束:
CREATE TABLE distributors (
did integer,
name varchar(40)
CONSTRAINT con1 CHECK (did > 100 AND name <> '')
);
為表 films 定義一茈D鍵表約束。 主鍵表約束可以定義在表上的一茤峖h-
茼r段。
CREATE TABLE films (
code char(5),
title varchar(40),
did integer,
date_prod date,
kind varchar(10),
len interval hour to minute,
CONSTRAINT code_title PRIMARY KEY(code,title)
);
為表 distributors 定義一茈D鍵約束。 下惆瑧例子是等效的,第一-
茖狺l使用了表約束語法, 第二茖洏峇F列約束表示法。
CREATE TABLE distributors (
did integer,
name varchar(40),
PRIMARY KEY(did)
);
CREATE TABLE distributors (
did integer PRIMARY KEY,
name varchar(40)
);
下掖o茖狺l給字段 name 賦予了一茪憟跼`量預設A 並且將字段 did 的預設-
w排為通過選擇序列對象的下一蚧生成。 modtime 的預設N是該行插入的時-
啋漁伅﹛C
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 integer CONSTRAINT no_null NOT NULL,
name varchar(40) NOT NULL
);
為 name 字段定義一荌艉@約束:
CREATE TABLE distributors (
did integer,
name varchar(40) UNIQUE
);
上悸漫M下掖o樣作為一茠磹蠽蘅n明是一樣的:
CREATE TABLE distributors (
did integer,
name varchar(40),
UNIQUE(name)
);
COMPATIBILITYe性
CREATE TABLE 遵循 SQL92 和 SQL99 的一茪l集,一些例外情況在下惘C出。
TEMPORARY TABLES{表
儘管 CREATE TEMPORARY TABLE 的語法和 SQL 標準的類似,
但是效果是不同的。在標準裏,臨時表只是定義一次並且自動存在(從空內容開始)於任何需-
n它怐熒|話中。 PostgreSQL n求每虓|話為它怢洏峈漕C蚆{時表發出它怞菑v的
CREATE TEMPORARY TABLE 命令。
這樣就允許不同的會話將相同的臨時表名字用於不同的目的,而標準的實現方法則把一-
蚆{時表名字約束為具有相同的表結構。
標準定義的臨時表的行為被廣泛地忽略了。PostgreSQL 在這方-
惜W地行為類似於許多其它 SQL 數據庫
標準中在全局和局部地臨時表之間的區別在 PostgreSQL
裏不存在,因為這種區別取決於模塊的概念,而 PostgreSQL 沒有這-
虓妝嚏C出於相容考慮,PostgreSQL 將接受臨時表聲明中的 GLOBAL 和 LOCAL
關鍵字, 但是他怢S有作用。
臨時表的 ON COMMIT 子句也類似於 SQL 標準, 但是有些區別。如果忽略了 ON
COMMIT 子句,SQL 聲明預設的行為是 ON COMMIT DELETE ROWS。 但是
PostgreSQL 裏的預設行為是 ON COMMIT PRESERVE ROWS。 在 SQL 裏不存在 ON
COMMIT DROP。
COLUMN CHECK CONSTRAINTSrqd束
SQL 標準說 CHECK 字段約束只能引用他怓I用的字段; 只有 CHECK
表約束才能引用多茼r段。PostgreSQL 並不強制這-
制;它把字段和表約束看作相同的東西。
NULL ``CONSTRAINT'' NULLINHERITANCE~承
通過 INHERITS 子句的多孩~承是 PostgreSQL 語言的擴展。 SQL99(但不包括
SQL92)使用不同的語法和語義定義了單繼承。 SQL99 榆瑼瘧~承還沒有在
PostgreSQL 中實現。
OBJECT IDSHID
PostgreSQL 的 OID 的概念不標準。
ZERO-COLUMN TABLESs表
PostgreSQL 允許創建沒有字段的表 (比如,CREATE TABLE foo();)。這是對
SQL 標準的擴展, 標準不允許存在零字段表。零字段表本-
沒什麼用,但是禁止他抪|給 ALTER TABLE DROP
COLUMN帶來很奇怪的情況,所以,這荇尕忽視標準的制好想很清楚。
SEE ALSO見
ALTER TABLE [alter_table(7)], DROP TABLE [drop_table(l)]
者
Postgresql <laser@pgsqldb.org>