?
This document uses PHP Chinese website manual Release
CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name ( [ { column_name data_type [ DEFAULT default_expr ] [ column_constraint [ ... ] ] | table_constraint | LIKE parent_table [ like_option ... ] } [, ... ] ] ) [ INHERITS ( parent_table [, ... ] ) ] [ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ TABLESPACE tablespace ] CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE table_name OF type_name [ ( { column_name WITH OPTIONS [ DEFAULT default_expr ] [ column_constraint [ ... ] ] | table_constraint } [, ... ] ) ] [ WITH ( storage_parameter [= value] [, ... ] ) | WITH OIDS | WITHOUT OIDS ] [ ON COMMIT { PRESERVE ROWS | DELETE ROWS | DROP } ] [ TABLESPACE tablespace ] 這里的column_constraint是: [ CONSTRAINT constraint_name ] { NOT NULL | NULL | CHECK ( expression ) | UNIQUE index_parameters | PRIMARY KEY index_parameters | REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ] [ ON DELETE action ] [ ON UPDATE action ] } [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] 而table_constraint是: [ CONSTRAINT constraint_name ] { CHECK ( expression ) | 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 action ] [ ON UPDATE action ] } [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] like_option是: { INCLUDING | EXCLUDING } { DEFAULTS | CONSTRAINTS | INDEXES | STORAGE | COMMENTS | ALL } index_parameters in UNIQUE, PRIMARY KEY, and EXCLUDE constraints are: [ WITH ( storage_parameter [= value] [, ... ] ) ] [ USING INDEX TABLESPACE tablespace ] exclude_element in an EXCLUDE constraint is: { column | ( expression ) } [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]
CREATE TABLE在當(dāng)前數(shù)據(jù)庫(kù)創(chuàng)建一個(gè)新的空白表。 該表將由發(fā)出此命令的用戶(hù)所擁有。
如果給出了模式名(比如CREATE TABLE myschema.mytable ...), 那么在指定的模式中創(chuàng)建表,否則在當(dāng)前模式中創(chuàng)建。臨時(shí)表存在于一個(gè)特殊的模式里, 因此創(chuàng)建臨時(shí)表的時(shí)候不能指定模式名。表名字必需在同一模式中的其它表、序列、索引、 視圖名字中唯一。
CREATE TABLE還自動(dòng)創(chuàng)建一個(gè)與該表的行對(duì)應(yīng)的復(fù)合數(shù)據(jù)類(lèi)型。因此, 表不能和同模式中的現(xiàn)有數(shù)據(jù)類(lèi)型同名。
可選的約束子句聲明約束,新行或者更新的行必須滿(mǎn)足這些約束才能成功插入或更新。 約束是一個(gè)SQL對(duì)象,它以多種方式協(xié)助在表上定義有效數(shù)值的集合。
定義約束有兩種方法:表約束和列約束。列約束是作為一個(gè)列定義的一部分定義的。 而表約束并不和某個(gè)列綁在一起,它可以作用于多個(gè)列上。每個(gè)列約束也可以寫(xiě)成表約束; 如果某個(gè)約束只影響一個(gè)列,那么列約束只是符號(hào)上的簡(jiǎn)潔方式而已。
創(chuàng)建為臨時(shí)表。臨時(shí)表在會(huì)話(huà)結(jié)束或(可選)當(dāng)前事務(wù)的結(jié)尾(參閱下面的ON COMMIT)自動(dòng)刪除。 除非用模式修飾的名字引用,否則現(xiàn)有的同名永久表在臨時(shí)表存在期間,在本會(huì)話(huà)過(guò)程中是不可見(jiàn)的。 任何在臨時(shí)表上創(chuàng)建的索引也都會(huì)被自動(dòng)刪除。
autovacuum daemon不能訪(fǎng)問(wèn)并且因此不能 清理或分析臨時(shí)表。為此,適當(dāng)?shù)那謇砗头治霾僮鲬?yīng)該通過(guò)會(huì)話(huà)SQL命令來(lái)執(zhí)行。 例如,若一個(gè)臨時(shí)表將要在復(fù)雜查詢(xún)中使用,那么添加后在臨時(shí)表中運(yùn)行ANALYZE 是明智的。
可以選擇在TEMPORARY或TEMP前面放上 GLOBAL或LOCAL。 不過(guò)這對(duì)PostgreSQL來(lái)說(shuō)沒(méi)有任何區(qū)別,可以參閱 兼容性。
要?jiǎng)?chuàng)建的表的名字(可以用模式修飾)
Creates a typed table, which takes its structure from the specified composite type (name optionally schema-qualified). A typed table is tied to its type; for example the table will be dropped if the type is dropped (with DROP TYPE ... CASCADE). 創(chuàng)建一個(gè)typed table,可以從指定的復(fù)合類(lèi)型 中獲取其結(jié)構(gòu)(名稱(chēng)可以有模式修飾)。一個(gè)類(lèi)型化的表與其類(lèi)型相關(guān); 例如表會(huì)在類(lèi)型刪除時(shí)被刪除(有DROP TYPE ... CASCADE0)。
When a typed table is created, then the data types of the columns are determined by the underlying composite type and are not specified by the CREATE TABLE command. But the CREATE TABLE command can add defaults and constraints to the table and can specify storage parameters. 當(dāng)一個(gè)typed表創(chuàng)建后,列的數(shù)據(jù)類(lèi)型由根本的組成類(lèi)型決定而且 不是由CREATE TABLE命令聲明的。但是 CREATE TABLE命令可以添加默認(rèn)值和約束到 表中,并能聲明存儲(chǔ)參數(shù)。
在新表中要?jiǎng)?chuàng)建的字段名字
該字段的數(shù)據(jù)類(lèi)型。它可以包括數(shù)組說(shuō)明符。 有關(guān)PostgreSQL支持的數(shù)據(jù)類(lèi)型的更多信息, 請(qǐng)參考Chapter 8。
DEFAULT子句給字段指定缺省值。該數(shù)值可以是任何不含 變量的表達(dá)式(不允許使用子查詢(xún)和對(duì)本表中的其它字段的交叉引用)。 缺省表達(dá)式的數(shù)據(jù)類(lèi)型必須和字段類(lèi)型匹配。
缺省表達(dá)式將被用于任何未聲明該字段數(shù)值的插入操作。如果沒(méi)有 指定缺省值則缺省值為NULL 。
可選的INHERITS子句聲明一系列的表,這個(gè)新表自動(dòng)從 這一系列表中繼承所有字段。
使用INHERITS將在子表和其父表之間創(chuàng)建一個(gè)永久的關(guān)系, 對(duì)父表結(jié)構(gòu)的修改通常也會(huì)傳播到子表。缺省時(shí),掃描父表的時(shí)候也會(huì) 掃描子表。
如果在多個(gè)父表中存在同名字段,那么就會(huì)報(bào)告一個(gè)錯(cuò)誤, 除非這些字段的數(shù)據(jù)類(lèi)型在每個(gè)父表里都是匹配的。如果沒(méi)有沖突, 那么重復(fù)的字段在新表中融合成一個(gè)字段。如果列出的新表字段名和繼承字段同名, 那么它的數(shù)據(jù)類(lèi)型也必須和繼承字段匹配,并且這些字段定義會(huì)融合成一個(gè)。 如果新表為該字段明確聲明了缺省值,那么此缺省值將覆蓋任何繼承字段的缺省值。 否則,該字段的所有父字段缺省值都必須相同,否則就會(huì)報(bào)錯(cuò)。
CHECK約束基本上以與列相同的方式合并。若多重父表和/或新表 定義包括同名的CHECK約束,那么這些約束必須都有相同的檢查 表達(dá)式,或者將要報(bào)告的錯(cuò)誤。有相同名稱(chēng)和表達(dá)式的約束將會(huì)合并到一個(gè)副 本中。注意:在新表中的一個(gè)未命名的CHECK約束將不會(huì)被合并, 因?yàn)橐粋€(gè)唯一的名稱(chēng)總會(huì)被為此選擇。
列STORAGE設(shè)置也可以從父表中被復(fù)制。
LIKE子句聲明一個(gè)表, 新表自動(dòng)從這個(gè)表里面繼承所有字段名及其數(shù)據(jù)類(lèi)型和非空約束。
和INHERITS不同,新表與原來(lái)的表之間在創(chuàng)建動(dòng)作完畢之后是完全無(wú)關(guān)的。 在源表做的任何修改都不會(huì)傳播到新表中, 并且也不可能在掃描源表的時(shí)候包含新表的數(shù)據(jù)。
字段缺省表達(dá)式只有在聲明了INCLUDING DEFAULTS之后才會(huì)包含進(jìn)來(lái)。 缺省是不包含缺省表達(dá)式的,結(jié)果是新表中所有字段的缺省值都是NULL 。
非空約束將總是復(fù)制到新表中,CHECK約束則僅在指定了INCLUDING CONSTRAINTS的時(shí)候才復(fù)制, 而其他類(lèi)型的約束則永遠(yuǎn)也不會(huì)被復(fù)制。此規(guī)則同時(shí)適用于表約束和列約束。
初始表上的任何索引都不能在新表上創(chuàng)建,除非INCLUDING INDEXES 子句被聲明了。
若INCLUDING STORAGE被聲明,復(fù)制的列定義的 STORAGE設(shè)置將會(huì)被復(fù)制。默認(rèn)響應(yīng)是排除 STORAGE設(shè)置,導(dǎo)致新表中的復(fù)制列有特定類(lèi)型的默認(rèn)設(shè)置。 要獲取更多關(guān)于STORAGE設(shè)置的細(xì)膩,請(qǐng)參閱 Section 54.2。
若INCLUDING COMMENTS被聲明,復(fù)制列的注釋、 約束以及索引將會(huì)僅僅被復(fù)制。默認(rèn)響應(yīng)是排除注釋?zhuān)瑢?dǎo)致新表中的 復(fù)制列和約束沒(méi)有注釋。
INCLUDING ALL是 INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING NDEXES INCLUDING STORAGE INCLUDING COMMENTS的縮寫(xiě)形式.
也要注意:不同于INHERITS,LIKE 復(fù)制的列和索引不會(huì)與相近命名的列和約束合并。若相同的名稱(chēng)被明確 指定或者在另一個(gè)LIKE子句中,則會(huì)報(bào)錯(cuò)。
和INHERITS不同, 列和被LIKE復(fù)制的約束并不使用相同的名字進(jìn)行融合。 如果明確的指定了相同的名字或者在另外一個(gè) LIKE子句中,那么將會(huì)報(bào)錯(cuò)。
可選的列約束或表約束的名字。如果約束本身是非法的,那么其名字將會(huì)出現(xiàn)在錯(cuò)誤信息中, 因此像col must be positive這樣的名字可以表達(dá)有用的約束信息。 如果約束名中含有空格則必須用雙引號(hào)界定。如果沒(méi)有指定約束名, 那么系統(tǒng)將會(huì)自動(dòng)生成一個(gè)名字。
字段不允許包含NULL值
字段允許包含NULL值,這是缺省。
這個(gè)子句的存在只是為和那些非標(biāo)準(zhǔn)SQL數(shù)據(jù)庫(kù)兼容。不建議在新應(yīng)用中使用它。
CHECK子句聲明一個(gè)產(chǎn)生布爾結(jié)果的表達(dá)式,新的或者更新的 行為了成功必須滿(mǎn)足插入或者更新操作。評(píng)估為T(mén)RUE或者UNKNOWN的表達(dá)式 成功。插入或者更新操作的任何行應(yīng)該產(chǎn)生一個(gè)錯(cuò)誤異常提出的FALSE結(jié)果 并且插入和更新吧改變數(shù)據(jù)庫(kù)。一個(gè)聲明為列約束的檢查約束應(yīng)該參照 列值唯一,盡管出現(xiàn)在一個(gè)表約束中的表達(dá)式可以參照多重表。
當(dāng)前,CHECK表達(dá)式既不包括子查詢(xún),也不涉及變量 而不是當(dāng)前行的列值。
UNIQUE約束表示表里的一個(gè)或多個(gè)字段的組合必須在全表范圍內(nèi)唯一。 唯一約束的行為和列約束一樣,只不過(guò)多了跨多行的能力。
對(duì)于唯一約束而言,NULL被認(rèn)為是互不相等的。
每個(gè)唯一約束都必須給其使用的字段集合賦予一個(gè)與其它唯一約束 都不同的名字,并且也不能和主鍵約束的名字相同,否則就被認(rèn)為 是同樣的約束寫(xiě)了兩次。
主鍵約束表明表中的一個(gè)或者一些字段只能包含唯一(不重復(fù))的非NULL值。 從技術(shù)上講,PRIMARY KEY只是UNIQUE和NOT NULL的組合, 不過(guò)把一套字段標(biāo)識(shí)為主鍵同時(shí)也體現(xiàn)了模式設(shè)計(jì)的元數(shù)據(jù), 因?yàn)橹麈I意味著可以拿這套字段用做行的唯一標(biāo)識(shí)。
一個(gè)表只能聲明一個(gè)主鍵,不管是作為字段約束還是表約束。
主鍵約束使用的字段集合應(yīng)該與其它唯一約束都不同。
EXCLUDE子句定義一個(gè)排斥約束,這保證了若任意兩行在 指定列或者使用指定操作符的表達(dá)式比較時(shí),并非全部比較都會(huì)返回 TRUE。若所有指定操作符都測(cè)試相等性,這就等價(jià)于 UNIQUE約束,盡管一個(gè)普通的唯一性約束會(huì)更快一些。 然而,排除約束可以聲明比簡(jiǎn)單的相等更常規(guī)的約束。例如,您可以 通過(guò)&&操作符聲明一個(gè)約束使得表中的任意兩 行都沒(méi)有重疊的內(nèi)容(參閱Section 8.8)。
排除約束通過(guò)使用索引來(lái)執(zhí)行,因此每個(gè)聲明的操作符必須與恰當(dāng)?shù)? 操作符類(lèi)聯(lián)系(參閱Section 11.9)獲取索引 訪(fǎng)問(wèn)方法index_method。操作符必須是可交換的。 每個(gè)exclude_element 可以選擇制定一個(gè)操作符類(lèi)和/或排序選項(xiàng);這在 CREATE INDEX中有全面的描述。
訪(fǎng)問(wèn)方法必須支持amgettuple(參閱Chapter 51); 目前這意味著GIN不能被使用。盡管是允許的,但使用有排斥約束 的B-tree或hash索引的幾乎沒(méi)有任何意義,因?yàn)檫@能做的一個(gè)普通唯一性約束就 可以做的很好了。所以訪(fǎng)問(wèn)方法總會(huì)是GiST。
predicate允許您在表的一個(gè)子集中聲明一個(gè) 排除約束;這在內(nèi)部創(chuàng)建了一個(gè)部分索引。請(qǐng)注意:為此必須用圓括號(hào)括起來(lái)。
這些子句聲明一個(gè)外鍵約束,外鍵約束要求新表中一列或多列組成的組 應(yīng)該只包含/匹配被參考的表中對(duì)應(yīng)字段中的值。如果省略refcolumn,則使用 reftable的主鍵。 被參考字段必須是被參考表中的非延期唯一字段或者主鍵。 請(qǐng)注意,不能在臨時(shí)表和永久表之間定義外鍵約束。
向參考字段插入的數(shù)值將使用給出的匹配類(lèi)型與被參考表中被參考列的 數(shù)值進(jìn)行匹配。有三種匹配類(lèi)型:MATCH FULL,MATCH PARTIAL和MATCH SIMPLE(缺省)。MATCH FULL不允許一個(gè)多字段 外鍵的字段為NULL ,除非所有外鍵字段都為NULL。 MATCH SIMPLE允許某些外鍵字段為NULL而外鍵的其它部 分不是NULL。MATCH PARTIAL目前尚未實(shí)現(xiàn)。
另外,當(dāng)被參考字段中的數(shù)據(jù)改變的時(shí)候,那么將對(duì)本表的字段中的數(shù)據(jù)執(zhí)行某種操作。 ON DELETE子句聲明當(dāng)被參考表中的被參考行被刪除的時(shí)候要執(zhí)行的操作。類(lèi)似的, ON UPDATE子句聲明被參考表中被參考字段更新為新值的時(shí)候要執(zhí)行的動(dòng)作。 如果該行被更新,但被參考的字段實(shí)際上沒(méi)有變化,那么就不會(huì)有任何動(dòng)作。 除了NO ACTION檢查之外的其他參考動(dòng)作都不能推遲,即使該約束聲明為可推遲也是如此。 下面是每個(gè)子句的可能動(dòng)作:
生成一個(gè)錯(cuò)誤,表明刪除或更新將產(chǎn)生一個(gè)違反外鍵約束的動(dòng)作。 如果該約束是可推遲的,并且如果還存在任何引用行, 那么這個(gè)錯(cuò)誤將在檢查約束的時(shí)候生成。這是缺省動(dòng)作。
生成一個(gè)表明刪除或更新將導(dǎo)致違反外鍵約束的錯(cuò)誤。 和NO ACTION一樣,只是動(dòng)作不可推遲。
刪除任何引用了被刪除行的行,或者分別把引用行的字段值更新 為被參考字段的新數(shù)值。
把引用行設(shè)置為NULL。
把引用字段設(shè)置為它們的缺省值。
如果被參考字段經(jīng)常更新,那么給外鍵字段增加一個(gè)索引可能是合適的, 這樣與外鍵字段相關(guān)聯(lián)的引用動(dòng)作可以更有效地執(zhí)行。
這兩個(gè)關(guān)鍵字設(shè)置該約束是否可推遲。一個(gè)不可推遲的約束將在每條命令之后馬上檢查。 可推遲約束可以推遲到事務(wù)結(jié)尾使用SET CONSTRAINTS命令檢查。 缺省是NOT DEFERRABLE。 目前只有UNIQUE,PRIMARY KEY, EXCLUDE和 REFERENCES(外鍵)約束接受這個(gè)子句。 NOT NULL和CHECK約束類(lèi)型都是不可推遲的。
如果約束是可推遲的,那么這個(gè)子句聲明檢查約束的缺省時(shí)間。 如果約束是INITIALLY IMMEDIATE(缺省),那么每條語(yǔ)句之后就立即檢查它。 如果約束是INITIALLY DEFERRED,那么只有在事務(wù)結(jié)尾才檢查它。 約束檢查的時(shí)間可以用SET CONSTRAINTS 命令修改。
這個(gè)子句為表或指定一個(gè)可選的存儲(chǔ)參數(shù),參見(jiàn)存儲(chǔ)參數(shù)獲取更多信息。 用于表的WITH子句還可以包含OIDS=TRUE或單獨(dú)的OIDS來(lái)指定給新表中的每一行都分配一個(gè)OID(對(duì)象標(biāo)識(shí)符), 或者OIDS=FALSE表示不分配OID 。 如果沒(méi)有指定OIDS默認(rèn)行為取決于default_with_oids配置參數(shù)。 如果新表是從有OID的表繼承而來(lái), 那么即使明確指定OIDS=FALSE也將強(qiáng)制按照OIDS=TRUE 執(zhí)行。
如果明確或隱含的指定了OIDS=FALSE,新表將不會(huì)存儲(chǔ)OID,也不會(huì)為行分配OID。 這將減小OID的開(kāi)銷(xiāo)并因此延緩了32-bit OID計(jì)數(shù)器的循環(huán)。 因?yàn)橐坏┯?jì)數(shù)器發(fā)生循環(huán)之后OID將不能被視為唯一,這將大大降低OID的實(shí)用性。 另外,排除了OID的表也為每條記錄減小了4字節(jié)的存儲(chǔ)空間,從而可以稍微提升 一些性能。
可以使用ALTER TABLE從已有的表中刪除OID列。
這些是被廢棄的、分別等價(jià)于WITH (OIDS) 和WITH (OIDS=FALSE)的語(yǔ)法。 WITH ( ... ) syntax;見(jiàn)上文。
使用ON COMMIT控制臨時(shí)表在事務(wù)塊結(jié)尾的行為。 這三個(gè)選項(xiàng)是:
在事務(wù)結(jié)尾不采取任何特別的動(dòng)作,這是缺省。
刪除臨時(shí)表中的所有行。本質(zhì)上是在每次提交事務(wù)后自動(dòng)執(zhí)行一個(gè)TRUNCATE命令。
刪除臨時(shí)表
tablespace是要?jiǎng)?chuàng)建新表的 表空間的名稱(chēng),若未聲明,則按照default_tablespace, 或者若表是臨時(shí)的則按照temp_tablespaces。
指定新表將要在tablespace 表空間內(nèi)創(chuàng)建。如果沒(méi)有聲明, 將查詢(xún)default_tablespace ,如果表為空,那么將使用 temp_tablespaces。
該子句允許選擇表空間的,在表空間中索引與UNIQUE, PRIMARY KEY,或者即將創(chuàng)建的EXCLUDE約束相關(guān)。若不聲明, 則按照default_tablespace,或者若表是臨時(shí)的就按照 temp_tablespaces。
這個(gè)子句允許選擇與一個(gè)UNIQUE,PRIMARY KEY約束相關(guān)的索引創(chuàng)建時(shí)所在的表空間?;蛘?tt class="LITERAL">EXCLUDE限制將被創(chuàng)建。 如果沒(méi)有聲明,將查詢(xún)default_tablespace, 如果表為空,那么將使用temp_tablespaces。
WITH子句可以為表聲明storage parameters,并且為與 UNIQUE,PRIMARY KEY,或者EXCLUDE 相關(guān)的索引。索引的存儲(chǔ)參數(shù)記錄在CREATE INDEX中。表目前可 用的存儲(chǔ)參數(shù)在下面列出。對(duì)于每個(gè)擦安琥,除非指出,有一個(gè)有同名前綴 toast.的額外參數(shù),這可以用于控制表的二級(jí)TOAST 表的性能,若有(參閱Section 54.2獲取更多關(guān)于TOAST的信息)。 請(qǐng)注意:TOAST表繼承來(lái)自其父表的autovacuum_*值,若沒(méi)有設(shè)置 toast.autovacuum_*設(shè)置。
一個(gè)表的填充因子(fillfactor)是一個(gè)介于10和100之間的百分?jǐn)?shù)。100(完全填充)是默認(rèn)值。 如果指定了較小的填充因子,INSERT操作僅按照填充因子指定的百分率填充表頁(yè)。 每個(gè)頁(yè)上的剩余空間將用于在該頁(yè)上更新行, 這就使得UPDATE有機(jī)會(huì)在同一頁(yè)上放置同一條記錄的新版本, 這比把新版本放置在其它頁(yè)上更有效。對(duì)于一個(gè)從不更新的表將填充因子設(shè)為100是最佳選擇, 但是對(duì)于頻繁更新的表,較小的填充因子則更加有效。此參數(shù)不能為T(mén)OAST表。
開(kāi)啟或者關(guān)閉在指定表上的autovacuum守護(hù)進(jìn)程。若為真,autovacuum守護(hù)進(jìn)程 將會(huì)開(kāi)始一個(gè)在特定表上的VACUUM操作,當(dāng)更新或者刪除元組的數(shù)量 超過(guò)關(guān)系中現(xiàn)有元組的估計(jì)數(shù)目的autovacuum_vacuum_threshold加 autovacuum_vacuum_scale_factor倍。類(lèi)似的,當(dāng)插入、更新或者 刪除的元組超過(guò)關(guān)系中現(xiàn)有元組的估計(jì)數(shù)目autovacuum_analyze_threshold 加autovacuum_analyze_scale_factor倍,則初始化一個(gè) ANALYZE操作。若錯(cuò)誤,該表將不會(huì)被自動(dòng)清理,除了阻止 事務(wù)Id環(huán)繞式處理。參閱Section 23.1.4 獲取更多關(guān)于阻止環(huán)繞式處理的信息。觀察會(huì)發(fā)現(xiàn)該變量從autovacuum設(shè)置中繼承其值。
初始換一個(gè)特定表上的VACUUM操作符之前, 更新或者刪除元組的最小值。
添加到autovacuum_vacuum_threshold的 reltuples乘法器。
ANALYZE operation on a particular table. 在特定表中初始化一個(gè)ANALYZE操作之前,插入、更新 或者刪除元組的最小值。
reltuples的乘法器要添加到 autovacuum_analyze_threshold。
Custom autovacuum_vacuum_cost_delay parameter.
Custom autovacuum_vacuum_cost_limit parameter.
自定義vacuum_freeze_min_age參數(shù)。 請(qǐng)注意autovacuum將會(huì)忽略嘗試將一個(gè)每個(gè)表的 autovacuum_freeze_min_age設(shè)置的大于系統(tǒng)范圍的 autovacuum_freeze_max_age設(shè)置的一半。
自定義autovacuum_freeze_max_age參數(shù), 請(qǐng)注意:autovacuum將會(huì)忽略企圖將每表 autovacuum_freeze_max_age設(shè)置得大于系統(tǒng)范圍的設(shè)置 (它只能設(shè)置的更?。?。請(qǐng)注意:當(dāng)您能把autovacuum_freeze_max_age 設(shè)置的非常小時(shí),或者甚至為0,這通常是不明智的,盡管這回強(qiáng)制頻繁的 自動(dòng)清理。
自定義vacuum_freeze_table_age參數(shù)。
不建議在新應(yīng)用中使用OID,可能情況下, 更好的選擇是使用一個(gè)SERIAL或者其它序列發(fā)生器做表的主鍵。 如果一個(gè)應(yīng)用使用了OID標(biāo)識(shí)表中的特定行,那么建議在該表的oid字段上創(chuàng)建一個(gè)唯一約束, 以確保該表的OID即使在計(jì)數(shù)器循環(huán)之后也是唯一的。 如果你需要一個(gè)整個(gè)數(shù)據(jù)庫(kù)范圍的唯一標(biāo)識(shí),那么就要避免假設(shè)OID是跨表唯一的, 你可以用tableoid和行OID的組合來(lái)實(shí)現(xiàn)這個(gè)目的。
Tip: 對(duì)那些沒(méi)有主鍵的表,不建議使用OIDS=FALSE,因?yàn)槿绻葲](méi)有OID又沒(méi)有唯一數(shù)據(jù)字段, 那么就很難標(biāo)識(shí)特定的行。
PostgreSQL自動(dòng)為每個(gè)唯一約束和主鍵約束創(chuàng)建一個(gè)索引以確保其唯一性。 因此,不必為主鍵字段明確的創(chuàng)建索引。 參閱 CREATE INDEX獲取更多信息。
唯一約束和主鍵在目前的實(shí)現(xiàn)里是不能繼承的。如果把繼承和唯一約束組合在一起會(huì)導(dǎo)致無(wú)法運(yùn)轉(zhuǎn)。
一個(gè)表不能超過(guò)1600個(gè)字段。實(shí)際的限制比這個(gè)更低,因?yàn)檫€有元組長(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 DEFAULT nextval('serial'), name varchar(40) NOT NULL CHECK (name <> '') );
創(chuàng)建一個(gè)帶有2維數(shù)組的表:
CREATE TABLE array_int ( vector int[][] );
為表films定義一個(gè)唯一表約束。唯一表約束可以在表的一個(gè)或多個(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è)例子是等效的,第一個(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) );
下面這個(gè)例子給字段name賦予了一個(gè)文本常量缺省值, 并且將字段did的缺省值安排為通過(guò)選擇序列對(duì)象的下一個(gè)值生成。 modtime的缺省值將是該行插入的時(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列約束,
其中之一明確給出了名字:
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 );
上面的和下面這樣作為一個(gè)表約束聲明是一樣的:
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è)范圍重合:
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è)復(fù)合類(lèi)型和一個(gè)類(lèi)型化表:
CREATE TYPE employee_type AS (name text, salary numeric); CREATE TABLE employees OF employee_type ( PRIMARY KEY (name), salary WITH OPTIONS DEFAULT 1000 );
CREATE TABLE遵循SQL標(biāo)準(zhǔn), 一些例外情況在下面列出。
盡管CREATE TEMPORARY TABLE的語(yǔ)法和SQL標(biāo)準(zhǔn)的類(lèi)似, 但是效果是不同的。在標(biāo)準(zhǔn)里,臨時(shí)表只是定義一次并且從空內(nèi)容開(kāi)始自動(dòng)存在于任何需要它們的會(huì)話(huà)中。 PostgreSQL要求每個(gè)會(huì)話(huà)為它們使用的每個(gè)臨時(shí)表發(fā)出它們自己的 CREATE TEMPORARY TABLE 命令。 這樣就允許不同的會(huì)話(huà)將相同的臨時(shí)表名字用于不同的目的, 而標(biāo)準(zhǔn)的實(shí)現(xiàn)方法則把一個(gè)臨時(shí)表名字約束為具有相同的表結(jié)構(gòu)。
標(biāo)準(zhǔn)定義的臨時(shí)表的行為被廣泛地忽略了。PostgreSQL在這方面上的行為類(lèi)似于許多其它SQL數(shù)據(jù)庫(kù)系統(tǒng)。
標(biāo)準(zhǔn)中的全局和局部臨時(shí)表之間的區(qū)別在PostgreSQL里不存在, 因?yàn)檫@種區(qū)別取決于模塊的概念,而PostgreSQL沒(méi)有這個(gè)概念。 出于兼容考慮,PostgreSQL將接受臨時(shí)表聲明中的GLOBAL和LOCAL關(guān)鍵字, 但是他們沒(méi)有任何作用。
臨時(shí)表的ON COMMIT子句也類(lèi)似于SQL標(biāo)準(zhǔn),但是有些區(qū)別。 如果忽略了ON COMMIT子句,SQL標(biāo)準(zhǔn)聲明缺省的行為是ON COMMIT DELETE ROWS。 但是PostgreSQL里的缺省行為是ON COMMIT PRESERVE ROWS。 在SQL標(biāo)準(zhǔn)里不存在ON COMMIT DROP選項(xiàng)。
當(dāng)一個(gè)UNIQUE或者PRIMARY KEY約束未延期, PostgreSQL每當(dāng)已插入或者更改列時(shí)就會(huì) 檢查唯一性。SQL標(biāo)準(zhǔn)要求僅在語(yǔ)句末強(qiáng)制唯一性;但這有時(shí)會(huì)有變化,例如 一個(gè)單獨(dú)的命令更新多個(gè)關(guān)鍵值的情況。要獲得遵循標(biāo)準(zhǔn)的行為,須聲明 約束為DEFERRABLE但不延期(例如:INITIALLY IMMEDIATE)。請(qǐng)注意,這明顯慢于直接唯一性檢查。
SQL標(biāo)準(zhǔn)說(shuō)CHECK列約束只能引用他們作用的字段; 只有CHECK表約束才能引用多個(gè)字段。 PostgreSQL并不強(qiáng)制這個(gè)限制;它把字段和表約束看作相同的東西。
EXCLUDE約束類(lèi)型是一個(gè) PostgreSQL擴(kuò)展。
NULL"約束"(實(shí)際上不是約束)是PostgreSQL對(duì)SQL標(biāo)準(zhǔn)的擴(kuò)展, 包括它是為了和其它一些數(shù)據(jù)庫(kù)系統(tǒng)兼容以及為了和NOT NULL約束對(duì)稱(chēng)。因?yàn)樗侨魏巫侄蔚娜笔?,所以它的出現(xiàn) 是沒(méi)有意義的。
通過(guò)INHERITS子句的多重繼承是PostgreSQL語(yǔ)言的擴(kuò)展。 SQL:1999及以后的標(biāo)準(zhǔn)使用不同的語(yǔ)法和語(yǔ)義定義了單繼承。SQL:1999風(fēng)格的繼承還沒(méi)有在 PostgreSQL中實(shí)現(xiàn)。
PostgreSQL允許創(chuàng)建沒(méi)有字段的表(比如CREATE TABLE foo();)。這是對(duì)SQL標(biāo)準(zhǔn)的擴(kuò)展, 標(biāo)準(zhǔn)不允許存在零字段表。零字段表本身沒(méi)什么用, 但是禁止他們會(huì)給ALTER TABLE DROP COLUMN帶來(lái)很奇怪的情況,所以, 這個(gè)時(shí)候忽視標(biāo)準(zhǔn)的限制概念非常清楚。
WITH子句是PostgreSQL的擴(kuò)展, 同樣,存儲(chǔ)參數(shù)和OID也是擴(kuò)展。
PostgreSQL的表空間概念不是標(biāo)準(zhǔn)的東西。 因此TABLESPACE和USING INDEX TABLESPACE都是擴(kuò)展。
類(lèi)型化表執(zhí)行SQL標(biāo)準(zhǔn)的一個(gè)子集。根據(jù)標(biāo)準(zhǔn),一個(gè)類(lèi)型化表有與底層復(fù)合類(lèi)型 以及另一個(gè)是"self-referencing column"的列相符合的列。 PostgreSQL明確不支持這些自參照列,但是在使用OID特性時(shí)會(huì)有相同的效果。