W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
CREATE TABLE — 定義一個(gè)新表
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name
( [ { column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ] | table_constraint | LIKE source_table
[ like_option ... ] } [, ... ]] )[ INHERITS ( parent_table [, ... ] ) ]
[ PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ COLLATE collation ] [
opclass ] [, ... ] ) ]
[ USING method ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ]
[ TABLESPACE tablespace_name ]
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name OF type_name [ ( { column_name [ WITH OPTIONS ] [ column_constraint [ ... ] ] | table_constraint } [, ... ]) ]
[ PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ COLLATE collation ] [ opclass ] [, ... ] ) ]
[ USING method ][ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ][ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ][ TABLESPACE tablespace_name ]
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXISTS ] table_name PARTITION OF
parent_table [ ( { column_name [ WITH OPTIONS ] [ column_constraint [ ... ] ] | table_constraint } [, ... ]) ] { FOR VALUES
partition_bound_spec
| DEFAULT }
[ PARTITION BY { RANGE | LIST | HASH } ( { column_name | ( expression ) } [ COLLATE collation ] [
opclass ] [, ... ] ) ]
[ USING method ]
[ WITH ( storage_parameter [= value] [, ... ] ) | WITHOUT OIDS ]
[ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ][ TABLESPACE tablespace_name ]
其中 column_constraint
是:
[ CONSTRAINT constraint_name ]{ NOT NULL | NULL | CHECK ( expression ) [ NO INHERIT ] |
DEFAULT default_expr | GENERATED ALWAYS AS ( generation_expr ) STORED |
GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ] |
UNIQUE index_parameters | PRIMARY KEY index_parameters | REFERENCES reftable
[ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
[ ON DELETE referential_action ] [ ON UPDATE referential_action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
table_constraint
是:
[ CONSTRAINT constraint_name ]{ CHECK ( expression ) [ NO INHERIT ] |
UNIQUE ( column_name [, ... ] ) index_parameters | PRIMARY KEY ( column_name [, ... ] ) index_parameters | EXCLUDE [ USING index_method ] ( exclude_element
WITH operator [, ... ] ) index_parameters [ WHERE ( predicate ) ] |
FOREIGN KEY ( column_name [, ... ] ) REFERENCES
reftable [ ( refcolumn [, ... ] ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE referential_action ] [ ON UPDATE
referential_action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
like_option
是:
{ INCLUDING | EXCLUDING } { COMMENTS | CONSTRAINTS | DEFAULTS | GENERATED | IDENTITY | INDEXES | STATISTICS | STORAGE | ALL }
partition_bound_spec
是:
IN ( partition_bound_expr
[, ...] ) |
FROM ( { partition_bound_expr
| MINVALUE | MAXVALUE } [, ...] )
TO ( { partition_bound_expr
| MINVALUE | MAXVALUE } [, ...] ) |
WITH ( MODULUS numeric_literal
, REMAINDER numeric_literal
)
UNIQUE
、PRIMARY KEY
以及EXCLUDE
約束中的index_parameters
是:
[ INCLUDE ( column_name [, ... ] ) ][ WITH ( storage_parameter [=
value] [, ... ] ) ][ USING INDEX TABLESPACE tablespace_name ]
一個(gè)EXCLUDE
約束中的exclude_element
是:
{ column_name| ( expression ) } [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]
CREATE TABLE
將在當(dāng)前數(shù)據(jù)庫(kù)中創(chuàng)建一個(gè)新的、初始為空的表。該表將由發(fā)出該命令的用戶所擁有。
如果給定了一個(gè)模式名(例如CREATE TABLE myschema.mytable ...
),那么該表被創(chuàng)建在指定的模式中。否則它被創(chuàng)建在當(dāng)前模式中。臨時(shí)表存在于一個(gè)特殊的模式中,因此在創(chuàng)建一個(gè)臨時(shí)表時(shí)不能給定一個(gè)模式名。該表的名稱必須與同一個(gè)模式中的任何其他表、序列、索引、視圖或外部表的名稱區(qū)分開(kāi)。
CREATE TABLE
也會(huì)自動(dòng)地創(chuàng)建一個(gè)數(shù)據(jù)類型來(lái)表示對(duì)應(yīng)于該表一行的組合類型。因此,表不能用同一個(gè)模式中任何已有數(shù)據(jù)類型的名稱。
可選的約束子句指定一個(gè)插入或更新操作要成功,新的或更新過(guò)的行必須滿足的約束(測(cè)試)。一個(gè)約束是一個(gè) SQL 對(duì)象,它幫助以多種方式定義表中的合法值集合。
有兩種方式來(lái)定義約束:表約束和列約束。一個(gè)列約束會(huì)作為列定義的一部分定義。一個(gè)表約束定義不與一個(gè)特定列綁定,并且它可以包含多于一個(gè)列。每一個(gè)列約束也可以被寫(xiě)作一個(gè)表約束,列約束只是一種當(dāng)約束只影響一列時(shí)方便書(shū)寫(xiě)的記號(hào)習(xí)慣。
要能創(chuàng)建一個(gè)表,你必須分別具有所有列類型或OF
子句中類型的USAGE
特權(quán)。
TEMPORARY
or TEMP
如果指定,該表被創(chuàng)建為一個(gè)臨時(shí)表。臨時(shí)表會(huì)被在會(huì)話結(jié)束時(shí)自動(dòng)被刪除,或者也可以選擇在當(dāng)前事務(wù)結(jié)束時(shí)刪除(見(jiàn)下文的ON COMMIT
)。當(dāng)臨時(shí)表存在時(shí),已有的同名持久表將對(duì)于當(dāng)前會(huì)話不可見(jiàn),不過(guò)可以使用模式限定的名稱進(jìn)行引用。在一個(gè)臨時(shí)表上創(chuàng)建的任何索引也自動(dòng)地變?yōu)榕R時(shí)的。
自動(dòng)清理守護(hù)進(jìn)程不能訪問(wèn)并且因此也不能清理或分析臨時(shí)表。由于這個(gè)原因,應(yīng)該通過(guò)會(huì)話的 SQL 命令執(zhí)行合適的清理和分析操作。例如,如果一個(gè)臨時(shí)表將要被用于復(fù)雜的查詢,最好在把它填充完畢后在其上運(yùn)行ANALYZE
。
可以選擇將GLOBAL
或LOCAL
寫(xiě)在TEMPORARY
或TEMP
的前面。這當(dāng)前在PostgreSQL中沒(méi)有區(qū)別并且已被廢棄,見(jiàn)本文中的?Compatibility。
?
UNLOGGED
如果指定,該表被創(chuàng)建為一個(gè)不受日志記錄的表。被寫(xiě)入到不做日志的表中的數(shù)據(jù)不會(huì)被寫(xiě)到預(yù)寫(xiě)式日志中(見(jiàn)第 29 章),這讓它們比普通表快非常多。不過(guò),它們?cè)诒罎r(shí)是不安全的:一個(gè)不做日志的表在一次崩潰或非干凈關(guān)閉之后會(huì)被自動(dòng)地截?cái)唷R粋€(gè)不做日志的表中的內(nèi)容也不會(huì)被復(fù)制到后備服務(wù)器中。在一個(gè)不做日志的表上創(chuàng)建的任何索引也會(huì)自動(dòng)地不被日志記錄。
IF NOT EXISTS
如果一個(gè)同名關(guān)系已經(jīng)存在,不要拋出一個(gè)錯(cuò)誤。在這種情況下會(huì)發(fā)出一個(gè)提示。注意這不保證現(xiàn)有的關(guān)系是和將要被創(chuàng)建的表相似的東西。
table_name
要被創(chuàng)建的表名(可以選擇用模式限定)。
OF type_name
創(chuàng)建一個(gè)類型化的表,它的結(jié)構(gòu)取自于指定的組合類型(名字可以選擇用模式限定)。一個(gè)類型化的表和它的類型綁定在一起,例如如果類型被刪除,該表也將被刪除(用DROP TYPE ... CASCADE
)。
當(dāng)一個(gè)類型化的表被創(chuàng)建時(shí),列的數(shù)據(jù)類型由底層的組合類型決定而沒(méi)有在CREATE TABLE
命令中直接指定。但是CREATE TABLE
命令可以對(duì)表增加默認(rèn)值和約束,并且可以指定存儲(chǔ)參數(shù)。
column_name
列的名稱會(huì)在新表中被建立.
data_type
列的數(shù)據(jù)類型. 這可以包括數(shù)組 規(guī)格. 有關(guān)PostgreSQL支持?jǐn)?shù)據(jù)類型的詳細(xì)信息, 請(qǐng)參考第 8 章.
COLLATE collation
COLLATE
子句為該列(必須是一種可排序數(shù)據(jù)類型)賦予一個(gè)排序規(guī)則。 如果沒(méi)有指定,將使用該列數(shù)據(jù)類型的默認(rèn)排序規(guī)則。
INHERITS ( parent_table
[, ... ] )
可選的INHERITS
子句指定一個(gè)表的列表, 新表將從其中自動(dòng)地繼承所有列。 父表可以是普通表或者外部表。
INHERITS
的使用在新的子表和它的父表之間創(chuàng)建一種持久的關(guān)系。 對(duì)于父表的模式修改通常也會(huì)傳播到子表, 并且默認(rèn)情況下子表的數(shù)據(jù)會(huì)被包括在對(duì)父表的掃描中。
如果在多個(gè)父表中存在同名的列,除非父表中每一個(gè)這種列的數(shù)據(jù)類型都能匹配, 否則會(huì)報(bào)告一個(gè)錯(cuò)誤。如果沒(méi)有沖突,那么重復(fù)列會(huì)被融合來(lái)形成新表中的一個(gè)單一列。 如果新表中的列名列表包含一個(gè)也是繼承而來(lái)的列名,該數(shù)據(jù)類型必須也匹配繼承的列, 并且列定義會(huì)被融合成一個(gè)。如果新表顯式地為列指定了任何默認(rèn)值, 這個(gè)默認(rèn)值將覆蓋來(lái)自該列繼承聲明中的默認(rèn)值。 否則,任何父表都必須為該列指定相同的默認(rèn)值,或者會(huì)報(bào)告一個(gè)錯(cuò)誤。
CHECK
約束本質(zhì)上也采用和列相同的方式被融合: 如果多個(gè)父表或者新表定義中包含相同的命名CHECK
約束, 這些約束必須全部具有相同的檢查表達(dá)式,否則將報(bào)告一個(gè)錯(cuò)誤。 具有相同名稱和表達(dá)式的約束將被融合成一份拷貝。 一個(gè)父表中的被標(biāo)記為NO INHERIT
的約束將不會(huì)被考慮。 注意新表中一個(gè)未命名的CHECK
約束將永遠(yuǎn)不會(huì)被融合,
因?yàn)槟菢涌偸菚?huì)為它選擇一個(gè)唯一的名字。
列的STORAGE
設(shè)置也會(huì)從父表復(fù)制過(guò)來(lái)。
如果父表中的列是標(biāo)識(shí)列,那么該屬性不會(huì)被繼承。 如果需要,可以將子表中的列聲明為標(biāo)識(shí)列。
PARTITION BY { RANGE | LIST | HASH } ( { column_name
| ( expression
) } [ opclass
] [, ...] )
可選的PARTITION BY
子句指定了對(duì)表進(jìn)行分區(qū)的策略。 這樣創(chuàng)建的表稱為分區(qū)表。 帶括號(hào)的列或表達(dá)式的列表構(gòu)成表的分區(qū)鍵。 使用范圍或哈希分區(qū)時(shí),分區(qū)鍵可以包含多個(gè)列或表達(dá)式(最多32個(gè),但在構(gòu)建 PostgreSQL時(shí)可以更改此限制), 但對(duì)于列表分區(qū),分區(qū)鍵必須由單個(gè)列或表達(dá)式組成。
范圍和列表分區(qū)需要 btree 運(yùn)算符類,而哈希分區(qū)需要哈希運(yùn)算符類。 如果沒(méi)有運(yùn)算符類被顯式指定,將使用相應(yīng)類型的默認(rèn)運(yùn)算符類; 如果不存在默認(rèn)運(yùn)算符類,則將引發(fā)錯(cuò)誤。 使用哈希分區(qū)時(shí),所使用的運(yùn)算符類必須實(shí)現(xiàn)支持功能 2(詳情請(qǐng)參閱第 37.16.3 節(jié))。
分區(qū)表被分成多個(gè)子表(稱為分區(qū)),它們是使用單獨(dú)的CREATE TABLE
命令創(chuàng)建的。 分區(qū)表本身是空的。插入到表中的數(shù)據(jù)行將根據(jù)分區(qū)鍵中的列或表達(dá)式的值路由到分區(qū)。 如果沒(méi)有現(xiàn)有的分區(qū)與新行中的值匹配,則會(huì)報(bào)告錯(cuò)誤。
分區(qū)表不支持EXCLUDE
約束; 但是,你可以在各個(gè)分區(qū)上定義這些約束。
有關(guān)表分區(qū)的更多討論,請(qǐng)參閱第 5.11 節(jié)
PARTITION OF parent_table
{ FOR VALUES partition_bound_spec
| DEFAULT }
將表創(chuàng)建為指定父表的分區(qū)。 該表建立時(shí),可以使用FOR VALUES
創(chuàng)建為特定值的分區(qū), 也可以使用DEFAULT
創(chuàng)建默認(rèn)分區(qū)。父表中存在的任何索引、 約束和用戶定義的行級(jí)觸發(fā)器都將克隆到新分區(qū)上。
partition_bound_spec
必須對(duì)應(yīng)于父表的分區(qū)方法和分區(qū)鍵,并且必須不能與該父表的任何現(xiàn)有分區(qū)重疊。 具有IN
的形式用于列表分區(qū), 具有FROM
和TO
的形式用于范圍分區(qū), 具有WITH
的形式用于哈希分區(qū)。
partition_bound_expr
是任何無(wú)變量表達(dá)式(不允許子查詢、窗口函數(shù)、聚合函數(shù)和集返回函數(shù))。 它的數(shù)據(jù)類型必須與相應(yīng)分區(qū)鍵列的數(shù)據(jù)類型相匹配。 表達(dá)式在表創(chuàng)建時(shí)只計(jì)算一次,因此它甚至可以包含易失性表達(dá)式,如
。CURRENT_TIMESTAMP
在創(chuàng)建列表分區(qū)時(shí),可以指定NULL
來(lái)表示分區(qū)允許分區(qū)鍵列為空。 但是,給定父表不能有多于一個(gè)這樣的列表分區(qū)。無(wú)法為范圍分區(qū)指定 NULL
。
創(chuàng)建范圍分區(qū)時(shí),由FROM
指定的下限是一個(gè)包含范圍, 而用TO
指定的上限是排除范圍。也就是說(shuō), 在FROM
列表中指定的值是該分區(qū)的相應(yīng)分區(qū)鍵列的有效值, 而TO
列表中的值不是。請(qǐng)注意, 必須根據(jù)按行比較的規(guī)則來(lái)理解此語(yǔ)句(第 9.24.5 節(jié))。 例如,給定PARTITION BY RANGE (x,y)
,分區(qū)范圍 FROM (1, 2) TO (3, 4)
允許x=1
與任何y>=2
, x=2
與任何非空
y
,和x=3
與任何y<4
。
在創(chuàng)建范圍分區(qū)以指示列值沒(méi)有下限或上限時(shí),可以使用特殊值MINVALUE
和MAXVALUE
。例如,使用FROM (MINVALUE) TO (10)
定義的分區(qū)允許任何小于10的值,并且使用FROM (10) TO (MAXVALUE)
定義的分區(qū)允許任何大于或等于10的值。
創(chuàng)建涉及多個(gè)列的范圍分區(qū)時(shí),將MAXVALUE
作為下限的一部分并將 MINVALUE
作為上限的一部分也是有意義的。例如,使用 FROM (0, MAXVALUE) TO (10, MAXVALUE)
定義的分區(qū)允許第一個(gè)分區(qū)鍵列大于0且小于或等于10的任何行。類似地, 使用FROM ('a', MINVALUE) TO ('b', MINVALUE)
定義的分區(qū)
允許第一個(gè)分區(qū)鍵列以"a"開(kāi)頭的任何行。
請(qǐng)注意,如果MINVALUE
或MAXVALUE
用于分區(qū)邊界的一列, 則必須為所有后續(xù)列使用相同的值。例如,(10, MINVALUE, 0)
不是有效的邊界;你應(yīng)該寫(xiě)(10, MINVALUE, MINVALUE)
。
還要注意,某些元素類型,如timestamp
,具有“無(wú)窮”的概念, 這只是另一個(gè)可以存儲(chǔ)的值。這與MINVALUE
和MAXVALUE
不同, 它們不是可以存儲(chǔ)的實(shí)際值,而是它們表示值無(wú)界的方式。MAXVALUE
可以被認(rèn)為比任何其他值(包括“無(wú)窮”)都大的值,
MINVALUE
可以被認(rèn)為是比任何其他值(包括“負(fù)無(wú)窮”)都小的值。因此, 范圍FROM ('infinity') TO (MAXVALUE)
不是空的范圍; 它只允許存儲(chǔ)一個(gè)值— "infinity"。
如果指定了DEFAULT
,則表將創(chuàng)建為父表的默認(rèn)分區(qū)。此選項(xiàng)不適用于哈希分區(qū)表。 不適合給定父級(jí)表的任何其他分區(qū)的分區(qū)鍵值將路由到默認(rèn)分區(qū)。
當(dāng)一個(gè)表已有DEFAULT
分區(qū)并且要對(duì)它添加新分區(qū)時(shí), 必須掃描默認(rèn)分區(qū)以驗(yàn)證它不包含可能屬于新分區(qū)的任何行。 如果默認(rèn)分區(qū)包含大量行,則速度可能會(huì)很慢。 如果默認(rèn)分區(qū)是外表或者它具有可證明的不可能包含能放置在新分區(qū)中的行的約束,則將略過(guò)掃描
當(dāng)創(chuàng)建哈希分區(qū)時(shí),必須指定模數(shù)和余數(shù)。 模數(shù)必須是正整數(shù),余數(shù)必須是小于模數(shù)的非負(fù)整數(shù)。 通常情況下,當(dāng)初始設(shè)置哈希分區(qū)表時(shí),應(yīng)選擇一個(gè)與分區(qū)數(shù)相等的模數(shù),并為每個(gè)表分配相同的模數(shù)和不同的余數(shù)(請(qǐng)參閱下方示例)。 不過(guò),并不要求每個(gè)分區(qū)都具有相同的模數(shù),只要求哈希分區(qū)表里面的分區(qū)中出現(xiàn)的每個(gè)模數(shù)都是下一個(gè)較大模數(shù)的因數(shù)。 這允許以增量的方式增加分區(qū)數(shù)量而不需要一次移動(dòng)所有數(shù)據(jù)。 例如,假設(shè)你有一個(gè)包含 8 個(gè)分區(qū)的哈希分區(qū)表,每個(gè)分區(qū)有模數(shù)8,但發(fā)現(xiàn)有必要將分區(qū)數(shù)增加到 16 個(gè)。 您可以拆分其中一個(gè)模數(shù)-8分區(qū),然后創(chuàng)建兩個(gè)新的模數(shù)-16分區(qū)來(lái)覆蓋鍵空間的相同部分(一個(gè)的余數(shù)等于被拆分的分區(qū)的余數(shù),另一個(gè)的余數(shù)等于該值加 8),而后用數(shù)據(jù)重新填充他們。 然后,你可以對(duì)每一個(gè)余數(shù)-8分區(qū)重復(fù)此操作過(guò)程,直到?jīng)]有剩余。 雖然這其中的每個(gè)步驟都可能會(huì)導(dǎo)致大量的數(shù)據(jù)移動(dòng)操作,它仍然要好于建一個(gè)全新的表并一次移動(dòng)全部數(shù)據(jù)。
分區(qū)必須與其所屬的分區(qū)表的字段名和類型相同。 對(duì)分區(qū)表字段名或類型的修改,將自動(dòng)傳播到所有分區(qū)。 CHECK
約束將自動(dòng)被每一個(gè)分區(qū)繼承,但是單獨(dú)的分區(qū)可以指定額外的CHECK
約束;與父表相同名稱和條件的額外約束將被父表約束合并。 可以為每個(gè)分區(qū)分別指定默認(rèn)值。但是請(qǐng)注意,在通過(guò)分區(qū)表插入元組時(shí)不會(huì)應(yīng)用分區(qū)的默認(rèn)值。
插入分區(qū)表中的行將自動(dòng)路由到正確的分區(qū)。如果不存在合適的分區(qū),則會(huì)發(fā)生錯(cuò)誤。
像TRUNCATE這樣的操作通常會(huì)影響一個(gè)表及其所有繼承子級(jí),這些操作將級(jí)聯(lián)到所有分區(qū), 但也可能在單個(gè)分區(qū)上執(zhí)行。請(qǐng)注意,使用DROP TABLE
刪除分區(qū)需要在父表上采用ACCESS EXCLUSIVE
鎖。
LIKE source_table
[ like_option
... ]
LIKE
指定新表將從哪一個(gè)表自動(dòng)地復(fù)制所有的列名、數(shù)據(jù)類型以及它們的非空約束。
和INHERITS
不同,新表和原始表在創(chuàng)建完成之后是完全分離的。對(duì)原始表的更改將不會(huì)被應(yīng)用到新表,并且不可能在原始表的掃描中包括新表的數(shù)據(jù)。
同樣與INHERITS
不同,用LIKE
拷貝的列和約束不會(huì)和相似的命名列及約束融合。如果顯式指定了相同的名稱或者在另一個(gè)LIKE
子句中指定了相同的名稱,將會(huì)發(fā)出一個(gè)錯(cuò)誤。
可選的like_option
子句指定要復(fù)制的原始表的附加屬性。 指定 INCLUDING
復(fù)制該屬性, 指定 EXCLUDING
忽略該屬性。EXCLUDING
為默認(rèn)值。 如果對(duì)同一類型的對(duì)象指定了多個(gè)規(guī)范,則使用最后一個(gè)規(guī)范??捎玫倪x項(xiàng)包括:
INCLUDING COMMENTS
復(fù)制的列、約束和索引的注釋將被復(fù)制。默認(rèn)行為是去除注釋,從而導(dǎo)致新表中復(fù)制的列和約束沒(méi)有注釋。
INCLUDING CONSTRAINTS
CHECK
約束將被復(fù)制。 列約束和表約束之間沒(méi)有區(qū)別。非空約束始終復(fù)制到新表。
INCLUDING DEFAULTS
復(fù)制列定義的默認(rèn)表達(dá)式將被復(fù)制。否則,不會(huì)復(fù)制默認(rèn)表達(dá)式,從而導(dǎo)致新表中復(fù)制的列具有空默認(rèn)值。 注意,復(fù)制調(diào)用數(shù)據(jù)庫(kù)修改函數(shù)的默認(rèn)值,例如nextval
,可能在原始表和新表之間創(chuàng)建功能聯(lián)系。
INCLUDING GENERATED
列定義的任何生成表達(dá)式將被復(fù)制。 默認(rèn)情況下,新列將是常規(guī)基本列。
INCLUDING IDENTITY
已復(fù)制列定義的任何標(biāo)識(shí)規(guī)范都將被復(fù)制。為新表的每個(gè)標(biāo)識(shí)列創(chuàng)建一個(gè)新序列,與與舊表關(guān)聯(lián)的序列分開(kāi)。
INCLUDING INDEXES
原始表上的索引、PRIMARY KEY
、 UNIQUE
和 EXCLUDE
約束將被建立在新表上。 根據(jù)默認(rèn)規(guī)則選擇新索引和約束的名稱,而不考慮原始的命名。(此行為可避免新索引可能出現(xiàn)重復(fù)名稱失敗。)
INCLUDING STATISTICS
擴(kuò)展統(tǒng)計(jì)信息將復(fù)制到新表。
INCLUDING STORAGE
已復(fù)制列定義的STORAGE
設(shè)置將被復(fù)制。 默認(rèn)行為是排除STORAGE
設(shè)置,從而導(dǎo)致新表中已復(fù)制列具有類型規(guī)定的默認(rèn)設(shè)置。 關(guān)于STORAGE
設(shè)置的更多信息,參見(jiàn)第 68.2 節(jié)。
INCLUDING ALL
INCLUDING ALL
是選擇所有可用的單獨(dú)選項(xiàng)的縮寫(xiě)形式。 (它能被用于在INCLUDING ALL
之后寫(xiě)單獨(dú)的EXCLUDING
子句,以選擇部分指定選項(xiàng)之外的所有選項(xiàng)。)
LIKE
子句也能被用來(lái)從視圖、外部表或組合類型拷貝列定義。不適合的選項(xiàng)(例如來(lái)自視圖的INCLUDING INDEXES
)會(huì)被忽略。
CONSTRAINT constraint_name
一個(gè)列約束或表約束的可選名稱。如果該約束被違背,約束名將會(huì)出現(xiàn)在錯(cuò)誤消息中,這樣類似列必須為正
的約束名可以用來(lái)與客戶端應(yīng)用溝通有用的約束信息(指定包含空格的約束名時(shí)需要用到雙引號(hào))。如果沒(méi)有指定約束名,系統(tǒng)將生成一個(gè)。
NOT NULL
該列不允許包含空值。
NULL
該列允許包含空值。這是默認(rèn)情況。
這個(gè)子句只是提供與非標(biāo)準(zhǔn) SQL 數(shù)據(jù)庫(kù)的兼容。在新的應(yīng)用中不推薦使用。
CHECK ( expression
) [ NO INHERIT ]
CHECK
指定一個(gè)產(chǎn)生布爾結(jié)果的表達(dá)式,一個(gè)插入或更新操作要想成功,其中新的或被更新的行必須滿足該表達(dá)式。計(jì)算出 TRUE 或 UNKNOWN 的表達(dá)式就會(huì)成功。只要任何一個(gè)插入或更新操作的行產(chǎn)生了 FALSE 結(jié)果,將報(bào)告一個(gè)錯(cuò)誤異常并且插入或更新不會(huì)修改數(shù)據(jù)庫(kù)。一個(gè)被作為列約束指定的檢查約束只應(yīng)該引用該列的值,而一個(gè)出現(xiàn)在表約束中的表達(dá)式可以引用多列。
當(dāng)前,CHECK
表達(dá)式不能包含子查詢,也不能引用當(dāng)前行的列之外的變量(參見(jiàn) 第 5.4.1 節(jié))。可以引用系統(tǒng)列tableoid
,但不能引用其他系統(tǒng)列。
一個(gè)被標(biāo)記為NO INHERIT
的約束將不會(huì)傳播到子表。
當(dāng)一個(gè)表有多個(gè)CHECK
約束時(shí),檢查完NOT NULL
約束后,對(duì)于每一行會(huì)以它們名稱的字母表順序來(lái)進(jìn)行檢查(版本 9.5 之前的PostgreSQL對(duì)于CHECK
約束不遵從任何特定的引發(fā)順序)。
DEFAULT
default_expr
DEFAULT
子句為出現(xiàn)在其定義中的列賦予一個(gè)默認(rèn)數(shù)據(jù)。該值是可以使用變量的表達(dá)式(特別是,不允許用對(duì)其他列的交叉引用)。子查詢也是不允許的。 默認(rèn)值表達(dá)式的數(shù)據(jù)類型必須匹配列的數(shù)據(jù)類型。
默認(rèn)值表達(dá)式將被用在任何沒(méi)有為該列指定值的插入操作中。如果一列沒(méi)有默認(rèn)值,那么默認(rèn)值為空值。
GENERATED ALWAYS AS ( generation_expr
) STORED
此子句將列創(chuàng)建為generated column。 列無(wú)法被寫(xiě)入,讀取時(shí)將返回指定表達(dá)式的結(jié)果。
關(guān)鍵字STORED
表示將在寫(xiě)入時(shí)計(jì)算列并將存儲(chǔ)在磁盤(pán)上。
生成表達(dá)式可以引用表中的其他列,但不能引用其他生成的列。使用的任何函數(shù)和運(yùn)算符都必須是不可改變的。不允許引用其他表。
GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options
) ]
該子句將列創(chuàng)建為標(biāo)識(shí)列。 它將擁有一個(gè)隱式序列附加到它,并且新行中的列將自動(dòng)從分配給它的序列中獲取值。
子句ALWAYS
和BY DEFAULT
確定如何在 INSERT
和UPDATE
命令中明確處理用戶指定的值。
在INSERT
命令中,如果選擇了ALWAYS
,則僅當(dāng) INSERT
語(yǔ)句指定OVERRIDING SYSTEM VALUE
時(shí) 才接受用戶指定的值。如果選擇BY DEFAULT
,則用戶指定的值優(yōu)先。 有關(guān)詳細(xì)信息,請(qǐng)參閱
INSERT
。(在COPY
命令中, 無(wú)論此設(shè)置如何,始終使用用戶指定的值。)
在UPDATE
命令中,如果選擇了ALWAYS
, 則將列更新為除DEFAULT
之外的任何值都將被拒絕。 如果選擇BY DEFAULT
,則該列可以正常更新。 (UPDATE
命令沒(méi)有OVERRIDING
子句。)
可選的sequence_options
子句可用于覆蓋序列的選項(xiàng)。 有關(guān)詳細(xì)信息,請(qǐng)參見(jiàn)CREATE SEQUENCE。
UNIQUE
(列約束)UNIQUE ( column_name
[, ... ] )
[ INCLUDE ( column_name
[, ...]) ] (表約束) UNIQUE
約束指定一個(gè)表中的一列或多列組成的組包含唯一的值。唯一表約束的行為與列約束的行為相同,只是表約束能夠跨越多列。
對(duì)于一個(gè)唯一約束的目的來(lái)說(shuō),空值不被認(rèn)為是相等的。
每一個(gè)唯一表約束必須命名一個(gè)列的集合,并且它與該表上任何其他唯一或主鍵約束所命名的列集合都不相同(否則它將是一個(gè)被列舉了兩次的約束)。
在為多級(jí)分區(qū)層次結(jié)構(gòu)建立唯一約束時(shí), 目標(biāo)分區(qū)表的分區(qū)鍵中的所有列,以及那些由它派生的所有分區(qū)表, 必須被包含在約束定義中。
添加唯一約束將自動(dòng)在使用于約束的列或列組上創(chuàng)建唯一的 btree索引。 可選子句 INCLUDE
在不強(qiáng)制唯一性的情況下向該索引添加一個(gè)或多個(gè)列。 請(qǐng)注意雖然約束在包含的列上是非強(qiáng)制的,但是它仍然依賴于它們。 因此,這些列上的某些操作(例如DROP COLUMN
)可能會(huì)導(dǎo)致級(jí)聯(lián)約束和索引刪除。
PRIMARY KEY
(列約束)PRIMARY KEY ( column_name
[, ... ] )
[ INCLUDE ( column_name
[, ...]) ] (表約束) PRIMARY KEY
約束指定表的一個(gè)或者多個(gè)列只能包含唯一(不重復(fù))、非空的值。一個(gè)表上只能指定一個(gè)主鍵,可以作為列約束或表約束。
主鍵約束所涉及的列集合應(yīng)該不同于同一個(gè)表上定義的任何唯一約束的列集合(否則,該唯一約束是多余的并且會(huì)被丟棄)。
PRIMARY KEY
強(qiáng)制的數(shù)據(jù)約束可以看成是UNIQUE
和NOT NULL
的組合, 不過(guò)把一組列標(biāo)識(shí)為主鍵也為模式設(shè)計(jì)提供了元數(shù)據(jù),因?yàn)橹麈I標(biāo)識(shí)其他表可以依賴這一個(gè)列集合作為行的唯一標(biāo)識(shí)符。
PRIMARY KEY
約束共享UNIQUE
約束放到分區(qū)表上時(shí)限制。
添加PRIMARY KEY
約束將自動(dòng)在用于約束的列或列組上創(chuàng)建唯一的 btree 索引。 可選的INCLUDE
子句允許指定將被包含在索引的非-鍵部分中的列的列表。 雖然包含的列的唯一性是非強(qiáng)制的,但約束仍依賴于它們。 因此,這些包含的列上的某些操作(例如DROP COLUMN
)可能會(huì)導(dǎo)致級(jí)聯(lián)約束和索引刪除。
EXCLUDE [ USING index_method
] ( exclude_element
WITH operator
[, ... ] ) index_parameters
[ WHERE ( predicate
) ]
EXCLUDE
子句定一個(gè)排除約束,它保證如果任意兩行在指定列或表達(dá)式上使用指定操作符進(jìn)行比較,不是所有的比較都將會(huì)返回TRUE
。如果所有指定的操作符都測(cè)試相等,這就等價(jià)于一個(gè)UNIQUE
約束,盡管一個(gè)普通的唯一約束將更快。不過(guò),排除約束能夠指定比簡(jiǎn)單相等更通用的約束。例如,你可以使用&&
操作符指定一個(gè)約束,要求表中沒(méi)有兩行包含相互覆蓋的圓(見(jiàn)
第 8.8 節(jié))。
排除約束使用一個(gè)索引實(shí)現(xiàn),這樣每一個(gè)指定的操作符必須與用于索引訪問(wèn)方法index_method
的一個(gè)適當(dāng)?shù)牟僮鞣悾ㄒ?jiàn)第 11.10 節(jié))相關(guān)聯(lián)。操作符被要求是交換的。每一個(gè)exclude_element
可以選擇性地指定一個(gè)操作符類或者順序選項(xiàng),這些在
CREATE INDEX
中有完整描述。
訪問(wèn)方法必須支持amgettuple
(見(jiàn)第 61 章),目前這意味著GIN無(wú)法使用。盡管允許,但是在一個(gè)排除約束中使用 B-樹(shù)或哈希索引沒(méi)有意義,因?yàn)樗鼰o(wú)法做得比一個(gè)普通唯一索引更出色。因此在實(shí)踐中訪問(wèn)方法將總是
GiST或SP-GiST。
predicate
允許你在該表的一個(gè)子集上指定一個(gè)排除約束。在內(nèi)部這會(huì)創(chuàng)建一個(gè)部分索引。注意在為此周圍的圓括號(hào)是必須的。
REFERENCES reftable
[ ( refcolumn
) ] [ MATCH matchtype
] [ ON DELETE referential_action
] [ ON UPDATE referential_action
]
(column constraint)FOREIGN KEY ( column_name
[, ... ] )
REFERENCES reftable
[ ( refcolumn
[, ... ] ) ]
[ MATCH matchtype
]
[ ON DELETE referential_action
]
[ ON UPDATE referential_action
]
(表約束)這些子句指定一個(gè)外鍵約束,它要求新表的一列或一個(gè)列的組必須只包含能匹配被引用表的某個(gè)行在被引用列上的值。 如果refcolumn
列表被忽略,將使用reftable
的主鍵。 被引用列必須是被引用表中一個(gè)非可延遲唯一約束或主鍵約束的列。 用戶必須在被引用的表(或整個(gè)表,或特定的引用列)上擁有REFERENCES
權(quán)限。
增加的外鍵約束需要SHARE ROW EXCLUSIVE
鎖定引用的表。 注意外鍵約束不能在臨時(shí)表和永久表之間定義。
被插入到引用列的一個(gè)值會(huì)使用給定的匹配類型與被引用表的值進(jìn)行匹配。 有三種匹配類型:MATCH FULL
、MATCH PARTIAL
以及MATCH SIMPLE
(這是默認(rèn)值)。 MATCH FULL
將不允許一個(gè)多列外鍵中的一列為空,除非所有外鍵列都是空;如果它們都是空,則不要求該行在被引用表中有一個(gè)匹配。
MATCH SIMPLE
允許任意外鍵列為空,如果任一為空,則不要求該行在被引用表中有一個(gè)匹配。 MATCH PARTIAL
現(xiàn)在還沒(méi)有被實(shí)現(xiàn)(當(dāng)然,NOT NULL
約束能被應(yīng)用在引用列上來(lái)組織這些情況發(fā)生)。
另外,當(dāng)被引用列中的數(shù)據(jù)被改變時(shí),在這個(gè)表的列中的數(shù)據(jù)上可以執(zhí)行特定的動(dòng)作。ON DELETE
指定當(dāng)被引用表中一個(gè)被引用行被刪除時(shí)要執(zhí)行的動(dòng)作。同樣,ON UPDATE
指定當(dāng)被引用表中一個(gè)被引用列被更新為新值時(shí)要執(zhí)行的動(dòng)作。如果該行被更新,但是被引用列并沒(méi)有被實(shí)際改變,不會(huì)做任何動(dòng)作。除了NO ACTION
檢查之外的引用動(dòng)作不能被延遲,即便該約束被聲明為可延遲的。對(duì)每一個(gè)子句可能有以下動(dòng)作:
NO ACTION
產(chǎn)生一個(gè)錯(cuò)誤指示刪除或更新將會(huì)導(dǎo)致一個(gè)外鍵約束違背。如果該約束被延遲,并且仍存在引用行,這個(gè)錯(cuò)誤將在約束檢查時(shí)被產(chǎn)生。這是默認(rèn)動(dòng)作。
RESTRICT
產(chǎn)生一個(gè)錯(cuò)誤指示刪除或更新將會(huì)導(dǎo)致一個(gè)外鍵約束違背。這個(gè)動(dòng)作與NO ACTION
形同,不過(guò)該檢查不是可延遲的。
CASCADE
刪除任何引用被刪除行的行,或者把引用列的值更新為被引用列的新值。
SET NULL
將引用列設(shè)置為空。
SET DEFAULT
設(shè)置引用列為它們的默認(rèn)值(如果該默認(rèn)值非空,在被引用表中必須有一行匹配該默認(rèn)值,否則該操作將會(huì)失?。?/p>
如果被引用列被頻繁地更改,最好在引用列上加上一個(gè)索引,這樣與外鍵約束相關(guān)的引用動(dòng)作能夠更高效地被執(zhí)行。
DEFERRABLE
NOT DEFERRABLE
這個(gè)子句控制該約束是否能被延遲。一個(gè)不可延遲的約束將在每一次命令后立刻被檢查。可延遲約束的檢查將被推遲到事務(wù)結(jié)束時(shí)進(jìn)行(使用SET CONSTRAINTS命令)。NOT DEFERRABLE
是默認(rèn)值。當(dāng)前,只有
UNIQUE
、PRIMARY KEY
、EXCLUDE
以及REFERENCES
(外鍵)約束接受這個(gè)子句。NOT NULL
以及CHECK
約束是不可延遲的。注意在包括ON CONFLICT DO UPDATE
子句的
INSERT
語(yǔ)句中,可延遲約束不能被用作沖突裁判者。
INITIALLY IMMEDIATE
INITIALLY DEFERRED
如果一個(gè)約束是可延遲的,這個(gè)子句指定檢查該約束的默認(rèn)時(shí)間。如果該約束是INITIALLY IMMEDIATE
,它會(huì)在每一個(gè)語(yǔ)句之后被檢查。這是默認(rèn)值。如果該約束是INITIALLY DEFERRED
,它只會(huì)在事務(wù)結(jié)束時(shí)被檢查。約束檢查時(shí)間可以用
SET CONSTRAINTS
命令修改。
USING method
此可選子句指定用于存儲(chǔ)新表內(nèi)容的表訪問(wèn)方法;該方法需要的是類型TABLE
的訪問(wèn)方法。詳見(jiàn) 第 60 章 。 如果未指定此選項(xiàng),則為新表選擇默認(rèn)表訪問(wèn)方法。詳見(jiàn)default_table_access_method。
WITH ( storage_parameter
[= value
] [, ... ] )
這個(gè)子句為一個(gè)表或索引指定可選的存儲(chǔ)參數(shù),詳見(jiàn)本文中的存儲(chǔ)參數(shù) 。 為了向后兼容性,表的WITH
子句還可以包括OIDS=FALSE
以便指定新表的行不應(yīng)包含 OIDs (對(duì)象標(biāo)識(shí)符),
OIDS=TRUE
不再受支持。
WITHOUT OIDS
這是向后兼容的語(yǔ)法,用于聲明表WITHOUT OIDS
,不再支持創(chuàng)建表WITH OIDS
。
ON COMMIT
臨時(shí)表在一個(gè)事務(wù)塊結(jié)束時(shí)的行為由ON COMMIT
控制。三種選項(xiàng)是:
PRESERVE ROWS
在事務(wù)結(jié)束時(shí)不采取特殊的動(dòng)作。這是默認(rèn)行為。
DELETE ROWS
在每一個(gè)事務(wù)塊結(jié)束時(shí)將刪除臨時(shí)表中的所有行。 實(shí)質(zhì)上,在每一次提交時(shí)會(huì)完成一次自動(dòng)的TRUNCATE。 當(dāng)應(yīng)用于分區(qū)表上時(shí),這不會(huì)級(jí)聯(lián)到它的分區(qū)。
DROP
在當(dāng)前事務(wù)塊結(jié)束時(shí)將刪除臨時(shí)表。 當(dāng)在分區(qū)表上使用時(shí),這個(gè)操作會(huì)刪除他的分區(qū),而在具有繼承子級(jí)的表上使用時(shí),它將刪除依賴的子級(jí)。
TABLESPACE tablespace_name
tablespace_name
是新表要?jiǎng)?chuàng)建于其中的表空間名稱。如果沒(méi)有指定,將參考default_tablespace,或者如果表是臨時(shí)的則參考temp_tablespaces。
對(duì)于分區(qū)表,由于表本身不需要存儲(chǔ),指定表空間將 default_tablespace
作為默認(rèn)表空間覆蓋,在未顯式指定其他表空間時(shí)用于任何新創(chuàng)建的分區(qū)。
USING INDEX TABLESPACE tablespace_name
這個(gè)子句允許選擇與一個(gè)UNIQUE
、PRIMARY KEY
或者EXCLUDE
約束相關(guān)的索引將被創(chuàng)建在哪個(gè)表空間中。如果沒(méi)有指定,將參考default_tablespace,或者如果表是臨時(shí)的則參考
temp_tablespaces。
WITH
子句能夠?yàn)楸砘蚺c一個(gè)UNIQUE
、PRIMARY KEY
或者EXCLUDE
約束相關(guān)的索引指定存儲(chǔ)參數(shù)。 用于索引的存儲(chǔ)參數(shù)已經(jīng)在CREATE INDEX中介紹過(guò)。 當(dāng)前可用于表的存儲(chǔ)參數(shù)在下文中列出。 如下文所示,對(duì)于很多這類參數(shù),都有一個(gè)名字帶有toast.
前綴的附加參數(shù),它能被用來(lái)控制該表的二級(jí)TOAST表(如果存在)的行為(關(guān)于 TOAST 詳見(jiàn)第 68.2 節(jié))。 如果一個(gè)表的參數(shù)值被設(shè)置但是相應(yīng)的toast.
參數(shù)沒(méi)有被設(shè)置,那么 TOAST 表將使用該表的參數(shù)值。 不支持為分區(qū)表指定這些參數(shù),但可以為單個(gè)葉子分區(qū)指定它們。
fillfactor
(integer
)
一個(gè)表的填充因子是一個(gè) 10 到 100 之間的百分?jǐn)?shù)。100(完全填滿)是默認(rèn)值。當(dāng)一個(gè)較小的填充因子被指定時(shí),INSERT
操作會(huì)把表頁(yè)面只填滿到指定的百分比,每個(gè)頁(yè)面上剩余的空間被保留給該頁(yè)上行的更新。這就讓UPDATE
有機(jī)會(huì)把一行的已更新版本放在與其原始版本相同的頁(yè)面上,這比把它放在一個(gè)不同的頁(yè)面上效率更高。對(duì)于一個(gè)項(xiàng)從來(lái)不會(huì)被更新的表來(lái)說(shuō),完全填滿是最好的選擇,但是在更新繁重的表上則較小的填充因子更合適。這個(gè)參數(shù)不能對(duì)
TOAST 表設(shè)置。
toast_tuple_target
(integer
)
在我們嘗試壓縮和/或?qū)㈤L(zhǎng)列值移動(dòng)到TOAST表中之前,toast_tuple_target指定需要的最小元組長(zhǎng)度, 也是在toasting開(kāi)始時(shí)嘗試減少長(zhǎng)度的目標(biāo)長(zhǎng)度。這會(huì)影響標(biāo)記為 External(用于移動(dòng))、 Main(用于壓縮)或 Extended(用于兩者)的列,并且僅適用于新元組。 對(duì)現(xiàn)有行沒(méi)有影響。 這僅影響標(biāo)記為"外部"或"擴(kuò)展"的列,并且僅適用于新元數(shù) - 對(duì)現(xiàn)有行沒(méi)有影響。 默認(rèn)情況下此參數(shù)設(shè)置為允許每個(gè)塊至少 4 個(gè)元組,默認(rèn)塊大小為 2040 字節(jié)。 有效值介于 128 字節(jié)和(塊大小-標(biāo)頭)之間,默認(rèn)大小為 8160 字節(jié)。 更改此值對(duì)于非常短或非常長(zhǎng)的行可能沒(méi)有用處。 請(qǐng)注意默認(rèn)設(shè)置通常接近最佳狀態(tài),在某些情況下設(shè)置此參數(shù)可能會(huì)產(chǎn)生負(fù)面影響。 不能對(duì)TOAST表設(shè)置此參數(shù)。
parallel_workers
(integer
)
這個(gè)參數(shù)設(shè)置用于輔助并行掃描這個(gè)表的工作者數(shù)量。 如果沒(méi)有設(shè)置這個(gè)參數(shù),系統(tǒng)將基于關(guān)系的尺寸來(lái)決定一個(gè)值。 規(guī)劃者或使用并行掃描的實(shí)用程序選擇的工作者數(shù)量可能會(huì)比較少,例如max_worker_processes的設(shè)置較小就是一種可能的原因。
autovacuum_enabled
, toast.autovacuum_enabled
(boolean
)
為一個(gè)特定的表啟用或者禁用自動(dòng)清理守護(hù)進(jìn)程。如果為真,自動(dòng)清理守護(hù)進(jìn)程將遵照第 24.1.6 節(jié)中討論的規(guī)則在這個(gè)表上執(zhí)行自動(dòng)的VACUUM
或者ANALYZE
操作。如果為假,這個(gè)表不會(huì)被自動(dòng)清理,不過(guò)為了阻止事務(wù)
ID 回卷時(shí)還是會(huì)對(duì)它進(jìn)行自動(dòng)的清理。有關(guān)回卷阻止請(qǐng)見(jiàn)第 24.1.5 節(jié)。如果autovacuum參數(shù)為假,自動(dòng)清理守護(hù)進(jìn)程根本就不會(huì)運(yùn)行(除非為了阻止事務(wù)
ID 回卷),設(shè)置獨(dú)立的表存儲(chǔ)參數(shù)也不會(huì)覆蓋這個(gè)設(shè)置。因此顯式地將這個(gè)存儲(chǔ)參數(shù)設(shè)置為true
很少有大的意義,只有設(shè)置為false
才更有用。
vacuum_index_cleanup
, toast.vacuum_index_cleanup
(boolean
)
當(dāng)VACUUM
在此表上運(yùn)行時(shí)啟用或禁用索引清理。默認(rèn)值為true
。 禁用索引清理可以顯著加快VACUUM
,但如果表修改很頻繁,也可能導(dǎo)致索引嚴(yán)重膨脹。 VACUUM的
INDEX_CLEANUP
參數(shù),如果指定,將覆蓋此選項(xiàng)的值。
vacuum_truncate
, toast.vacuum_truncate
(boolean
)
啟用或禁用vacuum以嘗試截?cái)啻吮砟┪驳娜魏慰枕?yè)。默認(rèn)值為true
。 如果true
,VACUUM
和autovacuum將執(zhí)行截?cái)啵財(cái)囗?yè)的磁盤(pán)空間將返回到操作系統(tǒng)。 請(qǐng)注意,截?cái)嘈枰?ACCESS EXCLUSIVE
在表上鎖定。VACUUM的TRUNCATE
參數(shù),如果指定,覆蓋此選項(xiàng)的值。
autovacuum_vacuum_threshold
, toast.autovacuum_vacuum_threshold
(integer
)
autovacuum_vacuum_threshold參數(shù)對(duì)于每個(gè)表的值。
autovacuum_vacuum_scale_factor
, toast.autovacuum_vacuum_scale_factor
(floating point
)
autovacuum_vacuum_scale_factor參數(shù)對(duì)于每個(gè)表的值。
autovacuum_vacuum_insert_threshold
, toast.autovacuum_vacuum_insert_threshold
(integer
)
autovacuum_vacuum_insert_threshold參數(shù)對(duì)于每個(gè)表的值。特殊值-1可用于禁用表上的插入為空。
autovacuum_vacuum_insert_scale_factor
, toast.autovacuum_vacuum_insert_scale_factor
(float4
)
autovacuum_vacuum_insert_scale_factor參數(shù)對(duì)于每個(gè)表的值。
autovacuum_analyze_threshold
(integer
)
autovacuum_analyze_threshold參數(shù)對(duì)于每個(gè)表的值。
autovacuum_analyze_scale_factor
(floating point
)
autovacuum_analyze_scale_factor參數(shù)對(duì)于每個(gè)表的值。
autovacuum_vacuum_cost_delay
, toast.autovacuum_vacuum_cost_delay
(floating point
)
autovacuum_vacuum_cost_delay參數(shù)對(duì)于每個(gè)表的值。
autovacuum_vacuum_cost_limit
, toast.autovacuum_vacuum_cost_limit
(integer
)
autovacuum_vacuum_cost_limit參數(shù)對(duì)于每個(gè)表的值。
autovacuum_freeze_min_age
, toast.autovacuum_freeze_min_age
(integer
)
vacuum_freeze_min_age參數(shù)對(duì)于每個(gè)表的值。注意自動(dòng)清理將忽略超過(guò)系統(tǒng)范圍autovacuum_freeze_max_age參數(shù)一半的針對(duì)每個(gè)表的
autovacuum_freeze_min_age
參數(shù)。
autovacuum_freeze_max_age
, toast.autovacuum_freeze_max_age
(integer
)
autovacuum_freeze_max_age參數(shù)對(duì)于每個(gè)表的值。注意自動(dòng)清理將忽略超過(guò)系統(tǒng)范圍參數(shù)(只能被設(shè)置得較?。┮话氲尼槍?duì)每個(gè)表的autovacuum_freeze_max_age
參數(shù)。
autovacuum_freeze_table_age
, toast.autovacuum_freeze_table_age
(integer
)
vacuum_freeze_table_age參數(shù)對(duì)于每個(gè)表的值。
autovacuum_multixact_freeze_min_age
, toast.autovacuum_multixact_freeze_min_age
(integer
)
vacuum_multixact_freeze_min_age參數(shù)對(duì)于每個(gè)表的值。注意自動(dòng)清理將忽略超過(guò)系統(tǒng)范圍autovacuum_multixact_freeze_max_age參數(shù)一半的針對(duì)每個(gè)表的
autovacuum_multixact_freeze_min_age
參數(shù)。
autovacuum_multixact_freeze_max_age
, toast.autovacuum_multixact_freeze_max_age
(integer
)
autovacuum_multixact_freeze_max_age參數(shù)對(duì)于每個(gè)表的值。注意自動(dòng)清理將忽略超過(guò)系統(tǒng)范圍參數(shù)(只能被設(shè)置得較?。┮话氲尼槍?duì)每個(gè)表的autovacuum_multixact_freeze_max_age
參數(shù)。
autovacuum_multixact_freeze_table_age
, toast.autovacuum_multixact_freeze_table_age
(integer
)
vacuum_multixact_freeze_table_age參數(shù)對(duì)于每個(gè)表的值。
log_autovacuum_min_duration
, toast.log_autovacuum_min_duration
(integer
)
log_autovacuum_min_duration參數(shù)對(duì)于每個(gè)表的值。
user_catalog_table
(boolean
)
聲明該表是一個(gè)用于邏輯復(fù)制目的的額外的目錄表。詳見(jiàn)第 48.6.2 節(jié)。不能對(duì) TOAST 表設(shè)置這個(gè)參數(shù)。
PostgreSQL為每一個(gè)唯一約束和主鍵約束創(chuàng)建一個(gè)索引來(lái)強(qiáng)制唯一性。因此,沒(méi)有必要顯式地為主鍵列創(chuàng)建一個(gè)索引(詳見(jiàn)CREATE INDEX)。
在當(dāng)前的實(shí)現(xiàn)中,唯一約束和主鍵不會(huì)被繼承。這使得繼承和唯一約束的組合相當(dāng)不正常。
一個(gè)表不能有超過(guò) 1600 列(實(shí)際上,由于元組長(zhǎng)度限制,有效的限制通常更低)。
創(chuàng)建表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 GENERATED BY DEFAULT AS IDENTITY,
name varchar(40) NOT NULL CHECK (name <> '')
);
創(chuàng)建有一個(gè)二維數(shù)組的表:
CREATE TABLE array_int (
vector int[][]
);
為表films
定義一個(gè)唯一表約束。唯一表約束能夠被定義在表的一列或多列上:
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)
);
定義一個(gè)列檢查約束:
CREATE TABLE distributors (
did integer CHECK (did > 100),
name varchar(40)
);
定義一個(gè)表檢查約束:
CREATE TABLE distributors (
did integer,
name varchar(40),
CONSTRAINT con1 CHECK (did > 100 AND name <> '')
);
為表films
定義一個(gè)主鍵表約束:
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
定義一個(gè)主鍵約束。下面的兩個(gè)例子是等價(jià)的,第一個(gè)使用表約束語(yǔ)法,第二個(gè)使用列約束語(yǔ)法:
CREATE TABLE distributors (
did integer,
name varchar(40),
PRIMARY KEY(did)
);
CREATE TABLE distributors (
did integer PRIMARY KEY,
name varchar(40)
);
為列name
賦予一個(gè)文字常量默認(rèn)值,安排列did
的默認(rèn)值是從一個(gè)序列對(duì)象中選擇下一個(gè)值產(chǎn)生,并且讓modtime
的默認(rèn)值是該行被插入的時(shí)間:
CREATE TABLE distributors (
name varchar(40) DEFAULT 'Luso Films',
did integer DEFAULT nextval('distributors_serial'),
modtime timestamp DEFAULT current_timestamp
);
在表distributors
上定義兩個(gè)NOT NULL
列約束,其中之一被顯式給定了一個(gè)名稱:
CREATE TABLE distributors (
did integer CONSTRAINT no_null NOT NULL,
name varchar(40) NOT NULL
);
為name
列定義一個(gè)唯一約束:
CREATE TABLE distributors (
did integer,
name varchar(40) UNIQUE
);
同樣的唯一約束用表約束指定:
CREATE TABLE distributors (
did integer,
name varchar(40),
UNIQUE(name)
);
創(chuàng)建相同的表,指定表和它的唯一索引指定 70% 的填充因子:
CREATE TABLE distributors (
did integer,
name varchar(40),
UNIQUE(name) WITH (fillfactor=70)
)
WITH (fillfactor=70);
創(chuàng)建表circles
,帶有一個(gè)排除約束阻止任意兩個(gè)圓重疊:
CREATE TABLE circles (
c circle,
EXCLUDE USING gist (c WITH &&)
);
在表空間diskvol1
中創(chuàng)建表cinemas
:
CREATE TABLE cinemas (
id serial,
name text,
location text
) TABLESPACE diskvol1;
創(chuàng)建一個(gè)組合類型以及一個(gè)類型化的表:
CREATE TYPE employee_type AS (name text, salary numeric);
CREATE TABLE employees OF employee_type (
PRIMARY KEY (name),
salary WITH OPTIONS DEFAULT 1000
);
創(chuàng)建一個(gè)范圍分區(qū)表:
CREATE TABLE measurement (
logdate date not null,
peaktemp int,
unitsales int
) PARTITION BY RANGE (logdate);
創(chuàng)建在分區(qū)鍵中具有多個(gè)列的范圍分區(qū)表:
CREATE TABLE measurement_year_month (
logdate date not null,
peaktemp int,
unitsales int
) PARTITION BY RANGE (EXTRACT(YEAR FROM logdate), EXTRACT(MONTH FROM logdate));
創(chuàng)建列表分區(qū)表:
CREATE TABLE cities (
city_id bigserial not null,
name text not null,
population bigint
) PARTITION BY LIST (left(lower(name), 1));
建立哈希分區(qū)表:
CREATE TABLE orders (
order_id bigint not null,
cust_id bigint not null,
status text
) PARTITION BY HASH (order_id);
創(chuàng)建范圍分區(qū)表的分區(qū):
CREATE TABLE measurement_y2016m07
PARTITION OF measurement (
unitsales DEFAULT 0
) FOR VALUES FROM ('2016-07-01') TO ('2016-08-01');
使用分區(qū)鍵中的多個(gè)列創(chuàng)建范圍分區(qū)表的幾個(gè)分區(qū):
CREATE TABLE measurement_ym_older
PARTITION OF measurement_year_month
FOR VALUES FROM (MINVALUE, MINVALUE) TO (2016, 11);
CREATE TABLE measurement_ym_y2016m11
PARTITION OF measurement_year_month
FOR VALUES FROM (2016, 11) TO (2016, 12);
CREATE TABLE measurement_ym_y2016m12
PARTITION OF measurement_year_month
FOR VALUES FROM (2016, 12) TO (2017, 01);
CREATE TABLE measurement_ym_y2017m01
PARTITION OF measurement_year_month
FOR VALUES FROM (2017, 01) TO (2017, 02);
創(chuàng)建列表分區(qū)表的分區(qū):
CREATE TABLE cities_ab
PARTITION OF cities (
CONSTRAINT city_id_nonzero CHECK (city_id != 0)
) FOR VALUES IN ('a', 'b');
創(chuàng)建本身是分區(qū)的列表分區(qū)表的分區(qū),然后向其添加分區(qū):
CREATE TABLE cities_ab
PARTITION OF cities (
CONSTRAINT city_id_nonzero CHECK (city_id != 0)
) FOR VALUES IN ('a', 'b') PARTITION BY RANGE (population);
CREATE TABLE cities_ab_10000_to_100000
PARTITION OF cities_ab FOR VALUES FROM (10000) TO (100000);
建立哈希分區(qū)表的分區(qū):
CREATE TABLE orders_p1 PARTITION OF orders
FOR VALUES WITH (MODULUS 4, REMAINDER 0);
CREATE TABLE orders_p2 PARTITION OF orders
FOR VALUES WITH (MODULUS 4, REMAINDER 1);
CREATE TABLE orders_p3 PARTITION OF orders
FOR VALUES WITH (MODULUS 4, REMAINDER 2);
CREATE TABLE orders_p4 PARTITION OF orders
FOR VALUES WITH (MODULUS 4, REMAINDER 3);
建立默認(rèn)分區(qū):
CREATE TABLE cities_partdef
PARTITION OF cities DEFAULT;
CREATE TABLE
命令遵從SQL標(biāo)準(zhǔn),除了以下例外。
盡管CREATE TEMPORARY TABLE
的語(yǔ)法很像 SQL 標(biāo)準(zhǔn)的語(yǔ)法,但事實(shí)是并不相同。在標(biāo)準(zhǔn)中,臨時(shí)表只需要被定義一次并且會(huì)自動(dòng)地存在(從空內(nèi)容開(kāi)始)于需要它們的每一個(gè)會(huì)話中。PostgreSQL則要求每一個(gè)會(huì)話為每一個(gè)要用的臨時(shí)表發(fā)出它自己的CREATE TEMPORARY TABLE
命令。這允許不同的會(huì)話為不同的目的使用相同的臨時(shí)表名,而標(biāo)準(zhǔn)的方法約束一個(gè)給定臨時(shí)表名的所有實(shí)例都必須具有相同的表結(jié)構(gòu)。
標(biāo)準(zhǔn)中對(duì)于臨時(shí)表行為的定義被廣泛地忽略了。PostgreSQL在這一點(diǎn)上的行為和多種其他 SQL 數(shù)據(jù)庫(kù)是相似的。
SQL 標(biāo)準(zhǔn)也區(qū)分全局和局部臨時(shí)表,其中一個(gè)局部臨時(shí)表為每一個(gè)會(huì)話中的每一個(gè) SQL 模塊具有一個(gè)獨(dú)立的內(nèi)容集合,但是它的定義仍然是多個(gè)會(huì)話共享的。因?yàn)?span id="44iyrv9" class="productname">PostgreSQL不支持 SQL 模塊,這種區(qū)別與PostgreSQL無(wú)關(guān)。
為了兼容性目的,PostgreSQL將在臨時(shí)表聲明中接受GLOBAL
和LOCAL
關(guān)鍵詞,但是它們當(dāng)前沒(méi)有效果。我們不鼓勵(lì)使用這些關(guān)鍵詞,因?yàn)槲磥?lái)版本的PostgreSQL可能采用一種更兼容標(biāo)準(zhǔn)的(對(duì)它們含義的)解釋。
臨時(shí)表的ON COMMIT
子句也和 SQL 標(biāo)準(zhǔn)相似,但是有一些不同。如果忽略ON COMMIT
子句,SQL 指定默認(rèn)行為是ON COMMIT DELETE ROWS
。但是,PostgreSQL中的默認(rèn)行為是ON COMMIT PRESERVE ROWS
。SQL
中不存在ON COMMIT DROP
選項(xiàng)。
但一個(gè)UNIQUE
或PRIMARY KEY
約束是非可延遲的,只要一個(gè)行被插入或修改,PostgreSQL就會(huì)立即檢查唯一性。SQL 標(biāo)準(zhǔn)指出只有在語(yǔ)句結(jié)束時(shí)才應(yīng)該強(qiáng)制唯一性。當(dāng)一個(gè)單一命令更新多個(gè)鍵值時(shí),這兩者是不同的。要得到兼容標(biāo)準(zhǔn)的行為,將該約束聲明為DEFERRABLE
但是不延遲(即
INITIALLY IMMEDIATE
)。注意這可能要顯著地慢于立即唯一性檢查。
SQL 標(biāo)準(zhǔn)指出CHECK
列約束只能引用它們應(yīng)用到的列,只有CHECK
表約束能夠引用多列。PostgreSQL并沒(méi)有強(qiáng)制這個(gè)限制,它同樣處理列檢查約束和表檢查約束。
EXCLUDE
約束 EXCLUDE
約束類型是一種PostgreSQL擴(kuò)展。
NULL
“約束” NULL
“約束”(實(shí)際上是一個(gè)非約束)是一個(gè)PostgreSQL對(duì) SQL 標(biāo)準(zhǔn)的擴(kuò)展,它也被包括(以及對(duì)稱的NOT NULL
約束)在一些其他的數(shù)據(jù)庫(kù)系統(tǒng)中以實(shí)現(xiàn)兼容性。因?yàn)樗侨我饬械哪J(rèn)值,它的存在就像噪聲一樣。
SQL標(biāo)準(zhǔn)規(guī)定在包含表或域的模式范圍內(nèi)表和域的約束必須具有唯一的名稱。 PostgreSQL是比較寬松的:它只需要約束名稱在附加到特定表或域的約束之間是唯一的。 但是,對(duì)于基于索引的約束(UNIQUE
,PRIMARY KEY
, and EXCLUDE
constraints),
這個(gè)特別的自由度并不存在, 因?yàn)殛P(guān)聯(lián)的索引被命名為與約束相同的名稱,并且索引名稱在相同模式的所有關(guān)系中必須是唯一的。
當(dāng)前,PostgreSQL沒(méi)有記錄NOT NULL
約束的名稱, 因此它們不受唯一性限制的影響。這在將來(lái)的版本中可能會(huì)改變。
通過(guò)INHERITS
子句的多繼承是一種PostgreSQL的語(yǔ)言擴(kuò)展。SQL:1999 以及之后的標(biāo)準(zhǔn)使用一種不同的語(yǔ)法和不同的語(yǔ)義定義了單繼承。SQL:1999-風(fēng)格的繼承還沒(méi)有被PostgreSQL。
PostgreSQL允許創(chuàng)建一個(gè)沒(méi)有列的表(例如CREATE TABLE foo();
)。這是一個(gè)對(duì)于 SQL 標(biāo)準(zhǔn)的擴(kuò)展,它不允許零列表。零列表本身并不是很有用,但是不允許它們會(huì)為ALTER TABLE DROP COLUMN
帶來(lái)奇怪的特殊情況,因此忽略這種規(guī)則限制看起來(lái)更加整潔。
PostgreSQL允許一個(gè)表?yè)碛卸鄠€(gè)標(biāo)識(shí)列。 該標(biāo)準(zhǔn)指定一個(gè)表最多只能有一個(gè)標(biāo)識(shí)列。這主要是為了給模式更改或遷移提供更大的靈活性。 請(qǐng)注意,INSERT
命令僅支持一個(gè)適用于整個(gè)語(yǔ)句的覆蓋子句, 因此不支持具有不同行為的多個(gè)標(biāo)識(shí)列。
STORED
選項(xiàng)不是標(biāo)準(zhǔn),但也用于其他 SQL 實(shí)現(xiàn)。 SQL 標(biāo)準(zhǔn)不規(guī)定生成列的存儲(chǔ)。
LIKE
子句雖然 SQL 標(biāo)準(zhǔn)中有一個(gè)LIKE
子句,但是PostgreSQL接受的很多LIKE
子句選項(xiàng)卻不在標(biāo)準(zhǔn)中,并且有些標(biāo)準(zhǔn)中的選項(xiàng)也沒(méi)有被PostgreSQL實(shí)現(xiàn)。
WITH
子句 WITH
子句是一個(gè)PostgreSQL擴(kuò)展,存儲(chǔ)參數(shù)不在標(biāo)準(zhǔn)中。
PostgreSQL的表空間概念不是標(biāo)準(zhǔn)的一部分。因此,子句TABLESPACE
和USING INDEX TABLESPACE
是擴(kuò)展。
類型化的表實(shí)現(xiàn)了 SQL 標(biāo)準(zhǔn)的一個(gè)子集。根據(jù)標(biāo)準(zhǔn),一個(gè)類型化的表具有與底層組合類型相對(duì)應(yīng)的列,以及其他的“自引用列”。PostgreSQL不顯式支持自引用列。
PARTITION BY
子句 PARTITION BY
子句是PostgreSQL的一個(gè)擴(kuò)展。
PARTITION OF
子句 PARTITION OF
子句PostgreSQL的一個(gè)擴(kuò)展。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: