PostgreSQL CREATE TABLE

2021-09-10 12:19 更新

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)。

參數(shù)

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

可以選擇將GLOBALLOCAL寫(xiě)在TEMPORARYTEMP的前面。這當(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ū), 具有FROMTO的形式用于范圍分區(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í),可以使用特殊值MINVALUEMAXVALUE。例如,使用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)注意,如果MINVALUEMAXVALUE用于分區(qū)邊界的一列, 則必須為所有后續(xù)列使用相同的值。例如,(10, MINVALUE, 0) 不是有效的邊界;你應(yīng)該寫(xiě)(10, MINVALUE, MINVALUE)

還要注意,某些元素類型,如timestamp,具有“無(wú)窮”的概念, 這只是另一個(gè)可以存儲(chǔ)的值。這與MINVALUEMAXVALUE不同, 它們不是可以存儲(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 KEYUNIQUEEXCLUDE約束將被建立在新表上。 根據(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)從分配給它的序列中獲取值。

子句ALWAYSBY DEFAULT確定如何在 INSERTUPDATE命令中明確處理用戶指定的值。

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ù)約束可以看成是UNIQUENOT 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)方法將總是 GiSTSP-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)前,只有 UNIQUEPRIMARY 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。

存儲(chǔ)參數(shù)

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)重膨脹。 VACUUMINDEX_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在表上鎖定。VACUUMTRUNCATE參數(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;

Compatibility

CREATE TABLE命令遵從SQL標(biāo)準(zhǔn),除了以下例外。

臨時(shí)表

盡管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í)表聲明中接受GLOBALLOCAL關(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è)UNIQUEPRIMARY 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)值,它的存在就像噪聲一樣。

Constraint Naming

SQL標(biāo)準(zhǔn)規(guī)定在包含表或域的模式范圍內(nèi)表和域的約束必須具有唯一的名稱。 PostgreSQL是比較寬松的:它只需要約束名稱在附加到特定表或域的約束之間是唯一的。 但是,對(duì)于基于索引的約束(UNIQUE,PRIMARY KEY, and EXCLUDEconstraints), 這個(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)更加整潔。

多個(gè)標(biāo)識(shí)列

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í)列。

Generated Columns

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)的一部分。因此,子句TABLESPACEUSING 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ò)展。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)