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