PostgreSQL ALTER TABLE

2021-09-08 16:54 更新

ALTER TABLE — 更改一個(gè)表的定義

大綱

ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]    action [, ... ]ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]    RENAME [ COLUMN ] column_name TO new_column_name
ALTER TABLE [ IF EXISTS ] [ ONLY ] name [ * ]    RENAME CONSTRAINT constraint_name TO new_constraint_nameALTER TABLE [ IF EXISTS ] name    RENAME TO new_nameALTER TABLE [ IF EXISTS ] name    SET SCHEMA new_schemaALTER TABLE ALL IN TABLESPACE name [ OWNED BY role_name [, ... ] ]    SET TABLESPACE new_tablespace [ NOWAIT ]ALTER TABLE [ IF EXISTS ] name    ATTACH PARTITION partition_name { FOR VALUES partition_bound_spec | DEFAULT }ALTER TABLE [ IF EXISTS ] name    DETACH PARTITION partition_name
其中action 是以下之一:

    ADD [ COLUMN ] [ IF NOT EXISTS ] column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]    DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ]    ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ] [ USING expression ]    ALTER [ COLUMN ] column_name SET DEFAULT expression    ALTER [ COLUMN ] column_name DROP DEFAULT    ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL    ALTER [ COLUMN ] column_name DROP EXPRESSION [ IF EXISTS ]    ALTER [ COLUMN ] column_name ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ]    ALTER [ COLUMN ] column_name { SET GENERATED { ALWAYS | BY DEFAULT } | SET sequence_option | RESTART [ [ WITH ] restart ] } [...]    ALTER [ COLUMN ] column_name DROP IDENTITY [ IF EXISTS ]    ALTER [ COLUMN ] column_name SET STATISTICS integer    ALTER [ COLUMN ] column_name SET ( attribute_option = value [, ... ] )    ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] )    ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }    ADD table_constraint [ NOT VALID ]    ADD table_constraint_using_index    ALTER CONSTRAINT constraint_name [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]    VALIDATE CONSTRAINT constraint_name    DROP CONSTRAINT [ IF EXISTS ]  constraint_name [ RESTRICT | CASCADE ]    DISABLE TRIGGER [ trigger_name | ALL | USER ]    ENABLE TRIGGER [ trigger_name | ALL | USER ]    ENABLE REPLICA TRIGGER trigger_name    ENABLE ALWAYS TRIGGER trigger_name    DISABLE RULE rewrite_rule_name    ENABLE RULE rewrite_rule_name   ENABLE REPLICA RULE rewrite_rule_name    ENABLE ALWAYS RULE rewrite_rule_name    DISABLE ROW LEVEL SECURITY    ENABLE ROW LEVEL SECURITY    FORCE ROW LEVEL SECURITY    NO FORCE ROW LEVEL SECURITY    CLUSTER ON index_name    SET WITHOUT CLUSTER    SET WITHOUT OIDS    SET TABLESPACE new_tablespace    SET { LOGGED | UNLOGGED }    SET ( storage_parameter [= value] [, ... ] )    RESET ( storage_parameter [, ... ] )    INHERIT parent_table    NO INHERIT parent_table    OF type_name
NOT OF OWNER TO { new_owner | CURRENT_USER | SESSION_USER } REPLICA IDENTITY { DEFAULT | USING INDEX index_name | FULL | NOTHING } and partition_bound_spec is:IN ( partition_bound_expr [, ...] ) | FROM ( { partition_bound_expr | MINVALUE | MAXVALUE } [, ...] ) TO ( { partition_bound_expr | MINVALUE | MAXVALUE } [, ...] ) |WITH ( MODULUS numeric_literal, REMAINDER numeric_literal ) and column_constraint is: [ 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 action ] [ ON UPDATE action ] }[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] 并且 table_constraint_using_index 是: [ CONSTRAINT constraint_name ] { UNIQUE | PRIMARY KEY } USING INDEX index_name [ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ] UNIQUEPRIMARY KEY以及EXCLUDE約束中的index_parameters是: [ INCLUDE ( column_name [, ... ] ) ] [ WITH ( storage_parameter [= value] [, ... ] ) ] [ USING INDEX TABLESPACE tablespace_name ] exclude_element in an EXCLUDE constraint is: { column_name | ( expression ) } [ opclass ] [ ASC | DESC ] [ NULLS { FIRST | LAST } ]

描述

ALTER TABLE更改一個(gè)現(xiàn)有表的定義。下文描述了 幾種形式。注意每一種形式所要求的鎖級(jí)別可能不同。如果沒(méi)有明確說(shuō)明,將會(huì) 獲得一個(gè)ACCESS EXCLUSIVE鎖。當(dāng)給出多個(gè)子命令時(shí),獲得 的鎖將是子命令所要求的最嚴(yán)格的那一個(gè)。

ADD COLUMN [ IF NOT EXISTS ]

這種形式向該表增加一個(gè)新列,使用與 CREATE TABLE相同的語(yǔ)法。如果指定了 IF NOT EXISTS并且使用這個(gè)名字的列已經(jīng)存在,則 不會(huì)拋出錯(cuò)誤。

DROP COLUMN [ IF EXISTS ]

這種形式從表刪除一列。涉及到該列的索引和表約束也將會(huì)被自動(dòng) 刪除。如果該列的移除會(huì)導(dǎo)致引用它的多元統(tǒng)計(jì)信息僅包含單一列的數(shù)據(jù),則該多元統(tǒng)計(jì)信息也將被移除。如果在該表之外有任何東西(例如外鍵引用或者視圖)依賴 于該列,你將需要用到CASCADE。如果指定了 IF EXISTS但該列不存在,則不會(huì)拋出錯(cuò)誤。 這種情況中會(huì)發(fā)出一個(gè)提示。

SET DATA TYPE

這種形式更改表中一列的類型。涉及到該列的索引和簡(jiǎn)單表約束將通過(guò) 重新解析最初提供的表達(dá)式被自動(dòng)轉(zhuǎn)換為使用新的列類型??蛇x的 COLLATE子句為新列指定一種排序規(guī)則,如果被省略, 排序規(guī)則會(huì)是新列類型的默認(rèn)排序規(guī)則??蛇x的USING 子句指定如何從舊的列值計(jì)算新列值,如果被省略,默認(rèn)的轉(zhuǎn)換和從舊類型 到新類型的賦值造型一樣。如果沒(méi)有從舊類型到新類型的隱式或者賦值造型, 則必須提供一個(gè) USING子句。

SET/DROP DEFAULT

這些表單設(shè)置或刪除列的默認(rèn)值(其中刪除等同于將默認(rèn)值設(shè)置為NULL)。 新的默認(rèn)值僅適用于后續(xù)的INSERTUPDATE命令; 它不會(huì)導(dǎo)致表中已有的行發(fā)生更改。

SET/DROP NOT NULL

這些形式更改一列是否被標(biāo)記為允許空值或者拒絕空值。

SET NOT NULL 只能應(yīng)用于列,前提是表中沒(méi)有任何記錄包含該列的NULL值。 通常,這一點(diǎn)在ALTER TABLE全表掃描時(shí)來(lái)檢查;但是,如果找到有效的CHECK約束證明不存在NULL,則跳過(guò)表掃描。

如果這個(gè)表是一個(gè)分區(qū),對(duì)于在父表中被標(biāo)記為NOT NULL的列,不能在其上執(zhí)行DROP NOT NULL。要從所有的分區(qū)中刪除NOT NULL約束,可以在父表上執(zhí)行DROP NOT NULL。即使在父表上沒(méi)有NOT NULL約束,這樣的約束還是能被增加到分區(qū)上。也就是說(shuō),即便父表允許空值,子表也可以不允許空值,但反過(guò)來(lái)不行。

DROP EXPRESSION [ IF EXISTS ]

此表單將存儲(chǔ)的生成的列轉(zhuǎn)換為普通的基本列。列中的現(xiàn)有數(shù)據(jù)將會(huì)保留, 但未來(lái)的更改將不會(huì)應(yīng)用于生成的表達(dá)式。

如果指定了DROP EXPRESSION IF EXISTS,并且該列不是存儲(chǔ)的已生成列,不會(huì)拋出任何錯(cuò)誤。 在這種情況下,將發(fā)出通知。

ADD GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY
SET GENERATED { ALWAYS | BY DEFAULT }
DROP IDENTITY [ IF EXISTS ]

這些形式更改一列是否是一個(gè)標(biāo)識(shí)列,或者是更改一個(gè)已有的標(biāo)識(shí)列的產(chǎn)生屬性。詳情請(qǐng)參考CREATE TABLE。 像SET DEFAULT一樣,這些形式僅影響隨后的INSERTUPDATE命令的行為。 它們不會(huì)導(dǎo)致表中已有的行發(fā)生更改。

如果DROP IDENTITY IF EXISTS被指定并且該列不是一個(gè)標(biāo)識(shí)列,則不會(huì)有錯(cuò)誤被拋出。在這種情況下會(huì)發(fā)出一個(gè)提示。

SET sequence_option
RESTART

這些形式修改位于一個(gè)現(xiàn)有標(biāo)識(shí)列之下的序列。sequence_option是一個(gè)ALTER SEQUENCE所支持的選項(xiàng),例如INCREMENT BY。

SET STATISTICS

這種形式為后續(xù)的ANALYZE操作設(shè)置針對(duì)每列 的統(tǒng)計(jì)收集目標(biāo)。目標(biāo)可以被設(shè)置在范圍 0 到 10000 之間,還可以 把它設(shè)置為 -1 來(lái)恢復(fù)到使用系統(tǒng)默認(rèn)的統(tǒng)計(jì)目標(biāo)( default_statistics_target)。更多有關(guān) PostgreSQL查詢規(guī)劃器使用統(tǒng)計(jì) 信息的內(nèi)容可見第 14.2 節(jié)。

SET STATISTICS要求一個(gè)SHARE UPDATE EXCLUSIVE鎖。

SET ( attribute_option = value [, ... ] )
RESET ( attribute_option [, ... ] )

這種形式設(shè)置或者重置每個(gè)屬性的選項(xiàng)。當(dāng)前,已定義的針對(duì)每個(gè)屬性的 選項(xiàng)只有n_distinctn_distinct_inherited, 它們會(huì)覆蓋后續(xù)ANALYZE操作所得到的可區(qū)分值數(shù)量 估計(jì)。n_distinct影響該表本身的統(tǒng)計(jì)信息,而 n_distinct_inherited影響為該表外加其繼承子女收集的統(tǒng)計(jì)信息。 當(dāng)被設(shè)置為一個(gè)正值時(shí),ANALYZE將假定該列剛好包含指定 數(shù)量的可區(qū)分非空值。當(dāng)被設(shè)置為一個(gè)負(fù)值(必須大于等于 -1)時(shí), ANALYZE將假定可區(qū)分非空值的數(shù)量與表的尺寸成線性比例, 確切的計(jì)數(shù)由估計(jì)的表尺寸乘以給定數(shù)字的絕對(duì)值計(jì)算得到。例如,值 -1 表示 該列中所有的值都是可區(qū)分的,而值 -0.5 則表示每一個(gè)值平均出現(xiàn)兩次。當(dāng)表 的尺寸隨時(shí)間變化時(shí),這會(huì)有所幫助,因?yàn)檫@種計(jì)算只有在查詢規(guī)劃時(shí)才會(huì)被 執(zhí)行。指定值為 0 將回到正常的估計(jì)可區(qū)分值數(shù)量的做法。更多有關(guān) PostgreSQL查詢規(guī)劃器使用統(tǒng)計(jì) 信息的內(nèi)容可見第 14.2 節(jié)。

更改針對(duì)每個(gè)屬性的選項(xiàng)要求一個(gè) SHARE UPDATE EXCLUSIVE鎖。

SET STORAGE

這種形式為一列設(shè)置存儲(chǔ)模式。這會(huì)控制這列是會(huì)被保持在線內(nèi)還是放在一個(gè) 二級(jí)TOAST表中,以及數(shù)據(jù)是否應(yīng)被壓縮。對(duì)于 integer之類的定長(zhǎng)、線內(nèi)、未壓縮值必須使用 PLAINMAIN用于線內(nèi)、可壓縮的 數(shù)據(jù)。EXTERNAL用于外部的、未壓縮數(shù)據(jù)。而 EXTENDED用于外部的、壓縮數(shù)據(jù)。對(duì)于大部分支持 非-PLAIN存儲(chǔ)的數(shù)據(jù)類型,EXTENDED 是默認(rèn)值。使用EXTERNAL將會(huì)讓很大的 textbytea之上的子串操作運(yùn)行得更快, 但是代價(jià)是存儲(chǔ)空間會(huì)增加。注意 SET STORAGE本身并不改變 表中的任何東西,它只是設(shè)置在未來(lái)的表更新時(shí)要追求的策略。詳見 第 68.2 節(jié)

ADD table_constraint [ NOT VALID ]

這種形式使用和CREATE TABLE相同的約束語(yǔ)法外加 NOT VALID選項(xiàng)為一個(gè)表增加一個(gè)新的約束,該選項(xiàng) 當(dāng)前只被允許用于外鍵和 CHECK 約束。

通常,此窗體將導(dǎo)致對(duì)表進(jìn)行掃描,以驗(yàn)證表中的所有現(xiàn)有行是否滿足新約束。 但是如果使用了 NOT VALID選項(xiàng) ,則跳過(guò)此可能很漫長(zhǎng)的掃描。 該約束仍將被強(qiáng)制到后續(xù)的插入和刪除上(也就是說(shuō),在外鍵的情況下如果在被引用表中沒(méi)有一個(gè)匹配的行,操作會(huì)失??;或者如果新行不匹配指定的檢查條件,操作也會(huì)失敗)。 但是數(shù)據(jù)庫(kù)不會(huì)假定約束對(duì)該表中的所有行都成立,直到通過(guò)使用VALIDATE CONSTRAINT選項(xiàng)對(duì)它進(jìn)行驗(yàn)證。 參見下述 Notes 以了解關(guān)于使用NOT VALID選項(xiàng)的更多信息。

盡管大多數(shù)形式的ADDtable_constraint 都需要ACCESS EXCLUSIVE鎖,但ADD FOREIGN KEY僅需要SHARE ROW EXCLUSIVE 鎖。 請(qǐng)注意,除了聲明約束的表上的鎖之外,ADD FOREIGN KEY還獲得了對(duì)引用表的SHARE ROW EXCLUSIVE鎖。

當(dāng)唯一或者主鍵約束被添加到分區(qū)表時(shí),會(huì)有額外的限制,請(qǐng)參考CREATE TABLE。 此外,當(dāng)前分區(qū)表上的外鍵約束不能被聲明為NOT VALID

ADD table_constraint_using_index

這種形式基于一個(gè)已有的唯一索引為一個(gè)表增加新的 PRIMARY KEYUNIQUE約束。該索引中的 所有列將被包括在約束中。

該索引不能有表達(dá)式列或者是一個(gè)部分索引。還有,它必須是一個(gè)帶有 默認(rèn)排序順序的 B-樹索引。這些限制確保該索引等效于使用常規(guī) ADD PRIMARY KEY或者ADD UNIQUE命令 時(shí)創(chuàng)建的索引。

如果PRIMARY KEY被指定,并且該索引的列沒(méi)有被標(biāo)記 NOT NULL,那么這個(gè)命令將嘗試對(duì)每一個(gè)這樣的列做 ALTER COLUMN SET NOT NULL。這需要一次全表掃描 來(lái)驗(yàn)證這些列不包含空值。在所有其他情況中,這都是一種很快的操作。

如果提供了一個(gè)約束名,那么該索引將被重命名以匹配該約束名。否則 該約束將被命名成索引的名稱。

這個(gè)命令被執(zhí)行后,該索引被增加的約束擁有,這和用常規(guī) ADD PRIMARY KEYADD UNIQUE命令 創(chuàng)建的索引一樣。特別地,刪掉該約束將會(huì)導(dǎo)致該索引也消失。

當(dāng)前在分區(qū)表上不支持這種形式。

注意

如果需要增加一個(gè)新的約束但是不希望長(zhǎng)時(shí)間阻塞表更新,那么使用現(xiàn)有 索引增加約束會(huì)有所幫助。要這樣做,用 CREATE INDEX CONCURRENTLY創(chuàng)建該索引,并且 接著使用這種語(yǔ)法把它安裝為一個(gè)正式的約束。例子見下文。

ALTER CONSTRAINT

這種形式修改之前創(chuàng)建的一個(gè)約束的屬性。當(dāng)前只能修改外鍵約束。

VALIDATE CONSTRAINT

這種形式驗(yàn)證之前創(chuàng)建為NOT VALID的外鍵或檢查約束, 它會(huì)掃描表來(lái)確保對(duì)于該約束沒(méi)有行不滿足約束。如果約束已經(jīng)被標(biāo)記為合法,則什么也不會(huì)發(fā)生。 (參見下述 Notes 以了解此命令用途的說(shuō)明。)

DROP CONSTRAINT [ IF EXISTS ]

這種形式在一個(gè)表上刪除指定的約束,還有位于該約束之下的任何索引。如果IF EXISTS 被指定并且該約束不存在,不會(huì)拋出錯(cuò)誤。在這種情況下會(huì)發(fā)出一個(gè)提示。

DISABLE/ENABLE [ REPLICA | ALWAYS ] TRIGGER

這些形式配置屬于該表的觸發(fā)器的觸發(fā)設(shè)置。系統(tǒng)仍然知道被禁用觸發(fā)器 的存在,但是即使它的觸發(fā)事件發(fā)生也不會(huì)執(zhí)行它。對(duì)于一個(gè)延遲觸發(fā)器, 會(huì)在事件發(fā)生時(shí)而不是觸發(fā)器函數(shù)真正被執(zhí)行時(shí)檢查其啟用狀態(tài)??梢越?用或者啟用用名稱指定的單個(gè)觸發(fā)器、表上的所有觸發(fā)器、用戶擁有的觸 發(fā)器(這個(gè)選項(xiàng)會(huì)排除內(nèi)部生成的約束觸發(fā)器,例如用來(lái)實(shí)現(xiàn)外鍵約束或 可延遲唯一和排除約束)。禁用或者啟用內(nèi)部生成的約束觸發(fā)器要求超級(jí) 用戶特權(quán),這樣做要小心因?yàn)槿绻@類觸發(fā)器不被執(zhí)行,約束的完整性當(dāng) 然無(wú)法保證。

觸發(fā)器引發(fā)機(jī)制也受到配置變量 session_replication_role的影響。當(dāng)復(fù)制角色是 origin(默認(rèn))或者local時(shí),被簡(jiǎn)單啟用的 觸發(fā)器將被觸發(fā)。被配置為ENABLE REPLICA的觸發(fā) 器只有在會(huì)話處于replica模式時(shí)才將被觸發(fā)。被配置為 ENABLE ALWAYS的觸發(fā)器的觸發(fā)不會(huì)考慮當(dāng)前復(fù)制 角色。

這種機(jī)制的效果就是,在默認(rèn)配置中,觸發(fā)器不會(huì)在復(fù)制體上引發(fā)。這種效果很有用,因?yàn)槿绻粋€(gè)觸發(fā)器在源頭上被用來(lái)在表之間傳播數(shù)據(jù),那么復(fù)制系統(tǒng)也將復(fù)制被傳播的數(shù)據(jù),并且觸發(fā)器不應(yīng)該在復(fù)制體上引發(fā)第二次,因?yàn)槟菚?huì)導(dǎo)致重復(fù)。不過(guò),如果一個(gè)觸發(fā)器被用于另一種目的(例如創(chuàng)建外部告警),那么將它設(shè)置為ENABLE ALWAYS可能更加合適,這樣它在復(fù)制體上也會(huì)被引發(fā)。

這個(gè)命令要求一個(gè)SHARE ROW EXCLUSIVE鎖。

DISABLE/ENABLE [ REPLICA | ALWAYS ] RULE

這些形式配置屬于表的重寫規(guī)則的觸發(fā)設(shè)置。系統(tǒng)仍然知道一個(gè)被禁用規(guī)則的 存在,但在查詢重寫時(shí)不會(huì)應(yīng)用它。其語(yǔ)義與禁用的/啟用的觸發(fā)器的一樣。 對(duì)于ON SELECT規(guī)則會(huì)忽略這個(gè)配置,即使當(dāng)前會(huì)話處于 一種非默認(rèn)的復(fù)制角色,這類規(guī)則總是會(huì)被應(yīng)用以保持視圖工作正常。

規(guī)則引發(fā)機(jī)制也受到配置變量session_replication_role的影響,這和上述的觸發(fā)器類似。

DISABLE/ENABLE ROW LEVEL SECURITY

這些形式控制屬于該表的行安全性策略的應(yīng)用。如果被啟用并且該表上 不存在策略,則將應(yīng)用一個(gè)默認(rèn)否定的策略。注意即使行級(jí)安全性被禁 用,在表上還是可以存在策略。在這種情況下,這些策略將會(huì)被應(yīng)用 并且會(huì)被忽略。另見CREATE POLICY。

NO FORCE/FORCE ROW LEVEL SECURITY

這些形式控制當(dāng)用戶是表?yè)碛姓邥r(shí)表上的行安全性策略的應(yīng)用。如果被啟用, 當(dāng)用戶是表?yè)碛姓邥r(shí),行級(jí)安全性策略將被應(yīng)用。如果被禁用(默認(rèn)),則 當(dāng)用戶是表?yè)碛姓邥r(shí),行級(jí)安全性將不會(huì)被應(yīng)用。另見 CREATE POLICY。

CLUSTER ON

這種形式為未來(lái)的CLUSTER操作選擇默認(rèn)的索引。 它不會(huì)真正地對(duì)表進(jìn)行聚簇。

改變聚簇選項(xiàng)要求一個(gè)SHARE UPDATE EXCLUSIVE鎖。http://www.o2fo.com/postgresql13_1/postgresql13_1-e9oq3jwz.html

SET WITHOUT CLUSTER

這種形式從表中移除最近使用的 CLUSTER索引說(shuō)明。這會(huì)影響未來(lái)的不指定索引 的聚簇操作。

改變聚簇選項(xiàng)要求一個(gè)SHARE UPDATE EXCLUSIVE鎖。

SET WITHOUT OIDS

向后兼容的語(yǔ)法,用于刪除oid系統(tǒng)列。由于oid系統(tǒng)列無(wú)法再添加,所以不會(huì)有實(shí)際效果。

SET TABLESPACE

這種形式把該表的表空間更改為指定的表空間并且把該表相關(guān)聯(lián)的數(shù)據(jù)文件 移動(dòng)到新的表空間中。表上的索引(如果有)不會(huì)被移動(dòng),但是它們可以用 額外的SET TABLESPACE命令單獨(dú)移動(dòng)。 當(dāng)應(yīng)用于分區(qū)表時(shí),不會(huì)移動(dòng)任何內(nèi)容,但之后用CREATE TABLE PARTITION OF創(chuàng)建的 任何分區(qū)將使用該表空間,除非被TABLESPACE子句覆蓋。

當(dāng)前數(shù)據(jù)庫(kù)在一個(gè)表空間中的所有表可以用ALL IN TABLESPACE形式 移動(dòng),這將會(huì)首先鎖住所有將被移動(dòng)的表然后逐個(gè)移動(dòng)。這種形式也支持 OWNED BY,它將只移動(dòng)指定角色所擁有的表。如果指 定了NOWAIT選項(xiàng),則命令將在無(wú)法立刻獲得所有所需 要的鎖時(shí)失敗。注意這個(gè)命令不移動(dòng)系統(tǒng)目錄;如果想要移動(dòng)系統(tǒng)目錄,應(yīng) 該用 ALTER DATABASE或者顯式的 ALTER TABLE調(diào)用。對(duì)于這種形式來(lái)說(shuō), information_schema關(guān)系不被認(rèn)為是系統(tǒng)目錄的一部分, 因此它們將會(huì)被移動(dòng)。另見CREATE TABLESPACE

SET { LOGGED | UNLOGGED }

This form changes the table from unlogged to logged or vice-versa (see UNLOGGED). It cannot be applied to a temporary table.

SET ( storage_parameter [= value] [, ... ] )

這種形式為該表更改一個(gè)或者更多存儲(chǔ)參數(shù)??捎玫膮?shù)請(qǐng)見 Storage ParametersCREATE TABLE。注意這個(gè) 命令將不會(huì)立刻修改表內(nèi)容,這取決于重寫表以得到想要的結(jié)果可能需要的 參數(shù)。可以用VACUUM FULL、CLUSTER或者 ALTER TABLE的一種形式來(lái)強(qiáng)制一次表重寫。對(duì)于規(guī)劃器相關(guān)的參數(shù),更改將從該表下一次被鎖定開始生效,因此當(dāng)前執(zhí)行的查詢不會(huì)受到影響。

對(duì)fillfactor、toast以及autovacuum存儲(chǔ)參數(shù),將會(huì)拿取SHARE UPDATE EXCLUSIVE鎖,就像計(jì)劃器參數(shù) parallel_workers。

RESET ( storage_parameter [, ... ] )

這種形式把一個(gè)或者更多存儲(chǔ)參數(shù)重置到它們的默認(rèn)值。和 SET一樣,可能需要一次表重寫來(lái)更新整個(gè)表。

INHERIT parent_table

這種形式把目標(biāo)表增加為指定父表的一個(gè)新子女。隨后,針對(duì)父親的查詢將 包括目標(biāo)表中的記錄。要被增加為一個(gè)子女,目標(biāo)表必須已經(jīng)包含和父表完 全相同的列(也可以有額外的列)。這些列必須具有匹配的數(shù)據(jù)類型,并且 如果它們?cè)诟副碇芯哂?code class="literal">NOT NULL約束,它們?cè)谧颖碇?也必須有NOT NULL約束。

也必須把子表約束與所有父表的CHECK約束進(jìn)行匹配, 不過(guò)父表中那些被標(biāo)記為非可繼承(也就是用ALTER TABLE ... ADD CONSTRAINT ... NO INHERIT 創(chuàng)建的)除外,它們會(huì)被忽略。所有匹配得上的子表約束不能被標(biāo)記為不可 繼承。當(dāng)前,UNIQUE、PRIMARY KEY 以及 FOREIGN KEY約束沒(méi)有被考慮,但是這種情況可能 會(huì)在未來(lái)發(fā)生變化。

NO INHERIT parent_table

這種形式把目標(biāo)表從指定父表的子女列表中移除。針對(duì)父表的查詢將不再包括 來(lái)自目標(biāo)表的記錄。

OF type_name

這種形式把該表鏈接到一種組合類型,就好像CREATE TABLE OF所做的那樣。該表的列名和類型列表必須精確地匹配該組合類型。 該表必須不從任何其他表繼承。這些限制確保CREATE TABLE OF能允許一個(gè)等價(jià)的表定義。

NOT OF

這種形式解除一個(gè)有類型的表和其類型之間的關(guān)聯(lián)。

OWNER TO

這種形式把表、序列、視圖、物化視圖或外部表的擁有者改為指定用戶。

REPLICA IDENTITY

這種形式更改被寫入到預(yù)寫式日志來(lái)標(biāo)識(shí)被更新或刪除行的信息。除非使用邏輯復(fù)制, 這個(gè)選項(xiàng)將不會(huì)產(chǎn)生效果。DEFAULT(非系統(tǒng)表的默認(rèn)值)記錄主鍵列 (如果有)的舊值。USING INDEX記錄被所提到的索引所覆蓋的列的 舊值,該索引必須是唯一索引、不是部分索引、不是可延遲索引并且只包括被標(biāo)記成 NOT NULL的列。 FULL記錄行中所有列的舊值。 NOTHING不記錄有關(guān)舊行的任何信息(這是系統(tǒng)表的默認(rèn)值)。在所 有情況下,除非至少有一個(gè)要被記錄的列在新舊行版本之間發(fā)生變化,將不記錄舊值。

RENAME

RENAME形式更改一個(gè)表(或者一個(gè)索引、序列、視圖、物化視圖 或者外部表)的名稱、表中一個(gè)列的名稱或者表的一個(gè)約束的名稱。在重命名一個(gè)具有底層索引的約束時(shí),該索引也會(huì)被重命名。它對(duì)已存儲(chǔ)的數(shù)據(jù) 沒(méi)有影響。

SET SCHEMA

這種形式把該表移動(dòng)到另一個(gè)模式中。相關(guān)的該表列擁有的索引、約束和序列也會(huì)被 移動(dòng)。

ATTACH PARTITION partition_name { FOR VALUES partition_bound_spec | DEFAULT }

這種形式把一個(gè)已有表(自身也可能被分區(qū))作為一個(gè)分區(qū)掛接到目標(biāo)表。該表可以為特定的值使用FOR VALUES掛接為分區(qū),或者用DEFAULT掛接為一個(gè)默認(rèn)分區(qū)。 對(duì)于目標(biāo)表中的每一個(gè)索引,在被掛接的表上都將創(chuàng)建一個(gè)響應(yīng)的索引,如果已經(jīng)存在等效的索引,該索引將被掛接到目標(biāo)表的索引,就像執(zhí)行了ALTER INDEX ATTACH PARTITION一樣。 請(qǐng)注意,如果現(xiàn)有表是外表,如果目標(biāo)表上有UNIQUE索引, 則當(dāng)前不允許將表作為目標(biāo)表的分區(qū)附加。(參見 CREATE FOREIGN TABLE.) 對(duì)于目標(biāo)表中存在的每個(gè)用戶定義的行級(jí)觸發(fā)器,將在附加表中創(chuàng)建一個(gè)對(duì)應(yīng)的觸發(fā)器。

一個(gè)使用FOR VALUES的分區(qū)使用與CREATE TABLEpartition_bound_spec相同的語(yǔ)法。分區(qū)邊界說(shuō)明必須對(duì)應(yīng)于目標(biāo)表的分區(qū)策略以及分區(qū)鍵。要被掛接的表必須具有和目標(biāo)表完全相同的所有列,并且不能有多出來(lái)的列,而且列的類型也必須匹配。此外,它必須有目標(biāo)表上所有的 NOT NULL以及CHECK約束。當(dāng)前不考慮FOREIGN KEY約束。來(lái)自于父表的UNIQUEPRIMARY KEY約束將被創(chuàng)建在分區(qū)上(如果它們還不存在)。如果被掛接的表上的任何CHECK約束被標(biāo)記為 NO INHERIT,則命令將失敗,這類約束必須被重建且重建時(shí)不能有NO INHERIT子句。

如果新分區(qū)是一個(gè)常規(guī)表,會(huì)執(zhí)行一次全表掃描來(lái)檢查表中現(xiàn)有行沒(méi)有違背分區(qū)約束。 可以通過(guò)對(duì)表增加一個(gè)有效的CHECK約束來(lái)避免這種掃描,該約束可以在運(yùn)行這個(gè)命令之前僅允許滿足所需分區(qū)約束的行。 CHECK約束可以解決讓表無(wú)需被掃描就能驗(yàn)證分區(qū)約束。但是,如果任一分區(qū)鍵是一個(gè)表達(dá)式并且該分區(qū)不接受NULL值,這種方式就無(wú)效了。 如果掛接一個(gè)不接受 NULL值的列表分區(qū),還應(yīng)該為分區(qū)鍵列增加NOT NULL約束,除非它是一個(gè)表達(dá)式。

如果新分區(qū)是一個(gè)外部表,則不需要驗(yàn)證該外部表中的所有行遵守分區(qū)約束(有關(guān)外部表上的約束請(qǐng)參考CREATE FOREIGN TABLE中的討論)。

當(dāng)一個(gè)表有默認(rèn)分區(qū)時(shí),定義新分區(qū)會(huì)更改默認(rèn)分區(qū)的分區(qū)約束。默認(rèn)分區(qū)不能包含任何需要被移動(dòng)到新分區(qū)中的行,并且將被掃描以驗(yàn)證不存在那樣的行。如果一個(gè)合適的CHECK約束存在,這種掃描(和新分區(qū)的掃描一樣)可以被避免。還是和新分區(qū)的掃描一樣,當(dāng)默認(rèn)分區(qū)是外部表時(shí)這種掃描總是會(huì)被跳過(guò)。

在父表上附加一個(gè)分區(qū)獲得一個(gè)SHARE UPDATE EXCLUSIVE鎖,除了要附加的表和默認(rèn)分區(qū)上的ACCESS EXCLUSIVE 鎖(如果有)。

DETACH PARTITION partition_name

這種形式會(huì)分離目標(biāo)表的指定分區(qū)。被分離的分區(qū)繼續(xù)作為獨(dú)立的表存在,但是與它之前掛接的表不再有任何聯(lián)系。任何被掛接到目標(biāo)表索引的索引也會(huì)被分離。 任何作為目標(biāo)表中那些表的副本創(chuàng)建的表也會(huì)被刪除。

除了RENAME、SET SCHEMA、ATTACH PARTITIONDETACH PARTITION之外,所有形式的ALTER TABLE都作用在單個(gè)表上,前面這些形式可以被組合成一個(gè)多修改的列表被一起應(yīng)用。例如,可以在一個(gè)命令中增加多個(gè)列并且/或者修改多個(gè)列的類型。對(duì)于大型表來(lái)說(shuō)這會(huì)特別有用,因?yàn)橹恍枰獙?duì)表做一趟操作。

要使用ALTER TABLE,你必須擁有該表。要更改一個(gè)表的 模式或者表空間,你還必須擁有新模式或表空間上的 CREATE特權(quán)。要把一個(gè)表作為一個(gè)父表的新子表加入, 你必須也擁有該父表。此外,要把一個(gè)表掛接為另一個(gè)表的新分區(qū),你必須擁有被掛接的表。要更改擁有者,你還必須 是新?lián)碛薪巧囊粋€(gè)直接或者間接成員,并且該角色必須具有該表的模式上的 CREATE特權(quán)(這些限制強(qiáng)制修改擁有者不能做一些通過(guò)刪除和重 建表做不到的事情。不過(guò),一個(gè)超級(jí)用戶怎么都能更改任何表的所有權(quán)。)。 要增加一個(gè)列、修改一列的類型或者使用OF子句,你還必 須具有該數(shù)據(jù)類型上的USAGE特權(quán)。

參數(shù)

IF EXISTS

如果表不存在則不要拋出一個(gè)錯(cuò)誤。這種情況下會(huì)發(fā)出一個(gè)提示。

name

要修改的一個(gè)現(xiàn)有表的名稱(可以是模式限定的)。如果在表名前指定了 ONLY,則只會(huì)修改該表。如果沒(méi)有指定ONLY, 該表及其所有后代表(如果有)都會(huì)被修改。可選地,在表名后面可以指定 *用來(lái)顯式地指示包括后代表。

column_name

一個(gè)新列或者現(xiàn)有列的名稱。

new_column_name

一個(gè)現(xiàn)有列的新名稱。

new_name

該表的新名稱。

data_type

一個(gè)新列的數(shù)據(jù)類型或者一個(gè)現(xiàn)有列的新數(shù)據(jù)類型。

table_constraint

該表的新的表約束。

constraint_name

一個(gè)新約束或者現(xiàn)有約束的名稱。

CASCADE

自動(dòng)刪除依賴于被刪除列或約束的對(duì)象(例如引用該列的視圖), 并且接著刪除依賴于那些對(duì)象的 所有對(duì)象(見第 5.14 節(jié))。

RESTRICT

如果有任何依賴對(duì)象時(shí)拒絕刪除列或者約束。這是默認(rèn)行為。

trigger_name

一個(gè)要禁用或啟用的觸發(fā)器的名稱。

ALL

禁用或者啟用屬于該表的所有觸發(fā)器(如果有任何觸發(fā)器是內(nèi)部產(chǎn)生的約 束觸發(fā)器則需要超級(jí)用戶特權(quán),例如那些被用來(lái)實(shí)現(xiàn)外鍵約束或者可延遲 一致性和排他約束的觸發(fā)器)。

USER

禁用或者啟用屬于該表的所有觸發(fā)器,內(nèi)部產(chǎn)生的約束觸發(fā)器(例如那些 被用來(lái)實(shí)現(xiàn)外鍵約束或者可延遲一致性和排他約束的觸發(fā)器)除外。

index_name

一個(gè)現(xiàn)有索引的名稱。

storage_parameter

一個(gè)表存儲(chǔ)參數(shù)的名稱。

value

一個(gè)表存儲(chǔ)參數(shù)的新值。根據(jù)該參數(shù),該值可能是一個(gè)數(shù)字或者一個(gè)詞。

parent_table

要與這個(gè)表關(guān)聯(lián)或者解除關(guān)聯(lián)的父表。

new_owner

該表的新?lián)碛姓叩挠脩裘?/p>

new_tablespace

要把該表移入其中的表空間的名稱。

new_schema

要把該表移入其中的模式的名稱。

partition_name

要被作為新分區(qū)附著到這個(gè)表或者從這個(gè)表上分離的表的名稱。

partition_bound_spec

新分區(qū)的分區(qū)邊界說(shuō)明。更多細(xì)節(jié)請(qǐng)參考CREATE TABLE相同的語(yǔ)法。

Notes

關(guān)鍵詞COLUMN是噪聲,可以被省略。

在使用ADD COLUMN增加一列并且指定了一個(gè)非易失性DEFAULT時(shí),默認(rèn)值會(huì)在該語(yǔ)句執(zhí)行時(shí)計(jì)算并且結(jié)果會(huì)被保存在表的元數(shù)據(jù)中。這個(gè)值將被用于所有現(xiàn)有行的該列。如果沒(méi)有指定DEFAULT,則使用NULL。在兩種情況下都不需要重寫表。

增加一個(gè)帶有非易失性DEFAULT子句的列或者更改一個(gè)現(xiàn)有列的類型將 要求重寫整個(gè)表及其索引。在更改一個(gè)現(xiàn)有列的類型時(shí)有一種例外:如果 USING子句不更改列的內(nèi)容并且舊類型在二進(jìn)制上與新類型可 強(qiáng)制轉(zhuǎn)換或者是新類型上的一個(gè)未約束域,則不需要重寫表。但是受影響列上 的任何索引仍必須被重建。對(duì)于一個(gè)大型表,表和/或索引重建可能會(huì)消耗相當(dāng)多的時(shí)間, 并且會(huì)臨時(shí)要求差不多兩倍的磁盤空間。

增加一個(gè)CHECK或者NOT NULL約束要求掃描 表以驗(yàn)證現(xiàn)有行符合該約束,但是不要求一次表重寫。

類似地,在掛接一個(gè)新分區(qū)時(shí),它需要被掃描以驗(yàn)證現(xiàn)有行滿足該分區(qū)約束。

提供在一個(gè)ALTER TABLE中指定多個(gè)更改的選項(xiàng)的主要 原因就是多次表掃描或者重寫可以因此被整合成一次。

掃描大型表以驗(yàn)證新的外鍵或檢查約束可能需要很長(zhǎng)時(shí)間,并且對(duì)表的其他更新將鎖定,直到ALTER TABLE ADD CONSTRAINT命令被提交。 NOT VALID約束選項(xiàng)的主要目的是減少對(duì)并發(fā)更新添加約束的影響。 使用 NOT VALIDADD CONSTRAINT命令不掃描表,可以立即提交。 在之后,VALIDATE CONSTRAINT命令會(huì)被發(fā)出以驗(yàn)證現(xiàn)有行是否滿足約束。 驗(yàn)證步驟不需要鎖定并發(fā)更新,因?yàn)樗榔渌聞?wù)將強(qiáng)制執(zhí)行它們插入或更新的行的約束;只有預(yù)先存在的行需要檢查。 因此,驗(yàn)證在被更改的表上僅獲得一個(gè)SHARE UPDATE EXCLUSIVE鎖。 (如果約束是外鍵,則 ROW SHARE鎖也需要約束的表引用。) 除了改進(jìn)并發(fā)性外,在已知該表包含預(yù)先存在的違規(guī)行為的情況下使用 NOT VALIDVALIDATE CONSTRAINT也能有作用。 一旦約束就位,就不能再插入新的違規(guī),,并且現(xiàn)有問(wèn)題可以在空閑時(shí)糾正,直到VALIDATE CONSTRAINT最終完成。

DROP COLUMN形式不會(huì)在物理上移除列,而只是簡(jiǎn) 單地讓它對(duì) SQL 操作不可見。后續(xù)該表中的插入和更新操作將為該列存儲(chǔ) 一個(gè)空值。因此,刪除一個(gè)列很快,但是它不會(huì)立刻減少表所占的磁盤空間, 因?yàn)楸粍h除列所占用的空間還沒(méi)有被回收。隨著現(xiàn)有列被更新,空間將被逐漸 回收。

要強(qiáng)制立即回收被已刪除列占據(jù)的空間,你可以執(zhí)行一種能導(dǎo)致全表重寫的 ALTER TABLE形式。這種形式會(huì)導(dǎo)致重新構(gòu)造每一個(gè)把被 刪除列替換為空值的行。

ALTER TABLE的重寫形式對(duì)于 MVCC 是不安全的。 在一次表重寫之后,如果并發(fā)事務(wù)使用的是一個(gè)在重寫發(fā)生前取得的 快照,該表將對(duì)這些并發(fā)事務(wù)呈現(xiàn)出空表的形態(tài)。詳見 第 13.5 節(jié)。

SET DATA TYPEUSING選項(xiàng)能實(shí)際指定 涉及該列舊值的任何表達(dá)式。也就是說(shuō),它可以不但可以引用要被轉(zhuǎn)換的列, 還可以引用其他列。這允許使用SET DATA TYPE語(yǔ)法完成十分 普遍的轉(zhuǎn)換。由于這種靈活性,USING表達(dá)式不適合于列 的默認(rèn)值(如果有),結(jié)果可能不是一個(gè)默認(rèn)值所需的常量表達(dá)式。這意味著 在沒(méi)有從舊類型到新類型的隱式或者賦值造型時(shí),即便提供了一個(gè) USING子句,SET DATA TYPE還是可能無(wú)法 轉(zhuǎn)換默認(rèn)值。在這種情況下,用DROP DEFAULT刪除該默認(rèn)值, 執(zhí)行ALTER TYPE并且接著使用SET DEFAULT增加 一個(gè)合適的新默認(rèn)值。類似的考慮也適用于涉及該列的索引和約束。

如果一個(gè)表有任何后代表,在不對(duì)后代表做相同操作的情況下,不允許在父表中增加列、重命名列或者更改列的類型。這確保了后代總是具有和父表匹配的列。類似地,如果不對(duì)所有后代上的CHECK約束進(jìn)行重命名,就不能在父表中重命名該CHECK約束,這樣CHECK約束也能在父表及其后代之間保持匹配(不過(guò),這個(gè)限制不適用于基于索引的約束)。此外,因?yàn)閺母副碇羞x擇也會(huì)從其后代中選擇,父表上的約束不能被標(biāo)記為有效,除非它在那些后代上也被標(biāo)記為有效。在所有這些情況下, ALTER TABLE ONLY都將被拒絕。

只有當(dāng)一個(gè)后代表的列不是從任何其他父表繼承而來(lái)并且沒(méi)有該列的獨(dú)立定義時(shí), 一次遞歸的DROP COLUMN操作才會(huì)移除該列。一次非遞歸 的DROP COLUMN(即 ALTER TABLE ONLY ... DROP COLUMN)不會(huì)移除 任何后代列,而是會(huì)把它們標(biāo)記成獨(dú)立定義的列。對(duì)于一個(gè)分區(qū)表,一個(gè)非遞歸的DROP COLUMN命令將會(huì)失敗,因?yàn)橐粋€(gè)表的所有分區(qū)都必須有和分區(qū)根節(jié)點(diǎn)相同的列。

標(biāo)識(shí)列的動(dòng)作(ADD GENERATED、SET等、DROP IDENTITY)以及動(dòng)作TRIGGER、CLUSTER、OWNERTABLESPACE不會(huì)遞歸到后代表上,也就是說(shuō)它們執(zhí)行時(shí)總是好像指定了ONLY一樣。增加約束的動(dòng)作僅對(duì)沒(méi)有標(biāo)記為 NO INHERITCHECK約束遞歸。

不允許更改一個(gè)系統(tǒng)目錄表的任何部分。

可用參數(shù)的進(jìn)一步描述請(qǐng)見CREATE TABLE。 第 5 章中有關(guān)于繼承的進(jìn)一步信息。

示例

要向一個(gè)表增加一個(gè)類型為varchar的列:

ALTER TABLE distributors ADD COLUMN address varchar(30);

這將導(dǎo)致表中所有現(xiàn)有行都用新列的空值填充。

要添加默認(rèn)值為非空的列:

ALTER TABLE measurements
  ADD COLUMN mtime timestamp with time zone DEFAULT now();

現(xiàn)有行將以當(dāng)前時(shí)間填充為新列的值,然后新行直將使用其插入時(shí)間。

要添加一列并用不同于默認(rèn)值的值填充它:

ALTER TABLE transactions
  ADD COLUMN status varchar(30) DEFAULT 'old',
  ALTER COLUMN status SET default 'current';

現(xiàn)有行將用old填充,但是隨后的命令的默認(rèn)值將是current。 其效果與在單獨(dú)的ALTER TABLE命令中發(fā)出兩個(gè)子命令的效果相同。

要從表中刪除一列:

ALTER TABLE distributors DROP COLUMN address RESTRICT;

要在一個(gè)操作中更改兩個(gè)現(xiàn)有列的類型:

ALTER TABLE distributors
    ALTER COLUMN address TYPE varchar(80),
    ALTER COLUMN name TYPE varchar(100);

通過(guò)一個(gè)USING子句更改一個(gè)包含 Unix 時(shí)間戳的整數(shù)列為 timestamp with time zone

ALTER TABLE foo
    ALTER COLUMN foo_timestamp SET DATA TYPE timestamp with time zone
    USING
        timestamp with time zone 'epoch' + foo_timestamp * interval '1 second';

同樣的,當(dāng)該列具有一個(gè)不能自動(dòng)造型成新數(shù)據(jù)類型的默認(rèn)值表達(dá)式時(shí):

ALTER TABLE foo
    ALTER COLUMN foo_timestamp DROP DEFAULT,
    ALTER COLUMN foo_timestamp TYPE timestamp with time zone
    USING
        timestamp with time zone 'epoch' + foo_timestamp * interval '1 second',
    ALTER COLUMN foo_timestamp SET DEFAULT now();

To rename an existing column:

ALTER TABLE distributors RENAME COLUMN address TO city;

重命名一個(gè)現(xiàn)有的表:

ALTER TABLE distributors RENAME TO suppliers;

重命名一個(gè)現(xiàn)有的約束:

ALTER TABLE distributors RENAME CONSTRAINT zipchk TO zip_check;

為一列增加一個(gè)非空約束:

ALTER TABLE distributors ALTER COLUMN street SET NOT NULL;

從一列移除一個(gè)非空約束:

ALTER TABLE distributors ALTER COLUMN street DROP NOT NULL;

向一個(gè)表及其所有子女增加一個(gè)檢查約束:

ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5);

只向一個(gè)表增加一個(gè)檢查約束(不為其子女增加):

ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5) NO INHERIT;

(該檢查約束也不會(huì)被未來(lái)的子女繼承)。

從一個(gè)表及其子女移除一個(gè)檢查約束:

ALTER TABLE distributors DROP CONSTRAINT zipchk;

只從一個(gè)表移除一個(gè)檢查約束:

ALTER TABLE ONLY distributors DROP CONSTRAINT zipchk;

(該檢查約束仍為子女表保留在某個(gè)地方)。

為一個(gè)表增加一個(gè)外鍵約束:

ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses (address);

為一個(gè)表增加一個(gè)外鍵約束,并且盡量不要影響其他工作:

ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses (address) NOT VALID;
ALTER TABLE distributors VALIDATE CONSTRAINT distfk;

為一個(gè)表增加一個(gè)(多列)唯一約束:

ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode);

為一個(gè)表增加一個(gè)自動(dòng)命名的主鍵約束,注意一個(gè)表只能擁有一個(gè)主鍵:

ALTER TABLE distributors ADD PRIMARY KEY (dist_id);

把一個(gè)表移動(dòng)到一個(gè)不同的表空間:

ALTER TABLE distributors SET TABLESPACE fasttablespace;

把一個(gè)表移動(dòng)到一個(gè)不同的模式:

ALTER TABLE myschema.distributors SET SCHEMA yourschema;

重建一個(gè)主鍵約束,并且在重建索引期間不阻塞更新:

CREATE UNIQUE INDEX CONCURRENTLY dist_id_temp_idx ON distributors (dist_id);
ALTER TABLE distributors DROP CONSTRAINT distributors_pkey,
    ADD CONSTRAINT distributors_pkey PRIMARY KEY USING INDEX dist_id_temp_idx;

要把一個(gè)分區(qū)掛接到一個(gè)范圍分區(qū)表上:

ALTER TABLE measurement
    ATTACH PARTITION measurement_y2016m07 FOR VALUES FROM ('2016-07-01') TO ('2016-08-01');

要把一個(gè)分區(qū)掛接到一個(gè)列表分區(qū)表上:

ALTER TABLE cities
    ATTACH PARTITION cities_ab FOR VALUES IN ('a', 'b');

要把一個(gè)分區(qū)掛接到一個(gè)哈希分區(qū)表上:

ALTER TABLE orders
    ATTACH PARTITION orders_p4 FOR VALUES WITH (MODULUS 4, REMAINDER 3);

要把一個(gè)默認(rèn)分區(qū)掛接到一個(gè)分區(qū)表上:

ALTER TABLE cities
    ATTACH PARTITION cities_partdef DEFAULT;

從一個(gè)分區(qū)表分離一個(gè)分區(qū):

ALTER TABLE measurement
    DETACH PARTITION measurement_y2015m12;

兼容性s

形式ADD(沒(méi)有USING INDEX)、 DROP [COLUMN]DROP IDENTITY、RESTART、 SET DEFAULT、SET DATA TYPE(沒(méi)有 USING)、 SET GENERATED以及SET sequence_option 服從SQL標(biāo)準(zhǔn)。其他形式都是PostgreSQL對(duì)SQL標(biāo)準(zhǔn)的擴(kuò)展。此外,在單個(gè)ALTER TABLE命令中指定多個(gè)操作的能力是一種擴(kuò)展。

ALTER TABLE DROP COLUMN可以被用來(lái)刪除一個(gè)表的唯一的 列,從而留下一個(gè)零列的表。這是一種 SQL 的擴(kuò)展,SQL 中不允許零列的表。


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

掃描二維碼

下載編程獅App

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

編程獅公眾號(hào)