W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
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_name
ALTER TABLE [ IF EXISTS ] name RENAME TO new_name
ALTER TABLE [ IF EXISTS ] name SET SCHEMA new_schema
ALTER 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 ]
UNIQUE
、PRIMARY 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ù)的INSERT
或 UPDATE
命令; 它不會(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
一樣,這些形式僅影響隨后的INSERT
和
UPDATE
命令的行為。 它們不會(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_distinct
和n_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)、未壓縮值必須使用 PLAIN
。MAIN
用于線內(nèi)、可壓縮的 數(shù)據(jù)。EXTERNAL
用于外部的、未壓縮數(shù)據(jù)。而
EXTENDED
用于外部的、壓縮數(shù)據(jù)。對(duì)于大部分支持 非-PLAIN
存儲(chǔ)的數(shù)據(jù)類型,EXTENDED
是默認(rèn)值。使用EXTERNAL
將會(huì)讓很大的 text
和bytea
之上的子串操作運(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ù)形式的ADD
都需要table_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 KEY
或UNIQUE
約束。該索引中的 所有列將被包括在約束中。
該索引不能有表達(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 KEY
或ADD 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 Parameters的 CREATE 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 TABLE中partition_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)自于父表的UNIQUE
和PRIMARY 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 PARTITION
和DETACH 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)。
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ǔ)法。
關(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 VALID
,ADD 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 VALID
和 VALIDATE 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 TYPE
的USING
選項(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
、OWNER
和TABLESPACE
不會(huì)遞歸到后代表上,也就是說(shuō)它們執(zhí)行時(shí)總是好像指定了ONLY
一樣。增加約束的動(dòng)作僅對(duì)沒(méi)有標(biāo)記為
NO INHERIT
的CHECK
約束遞歸。
不允許更改一個(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;
形式ADD
(沒(méi)有USING INDEX
)、 DROP [COLUMN]
、DROP IDENTITY
、RESTART
、 SET DEFAULT
、SET DATA TYPE
(沒(méi)有
USING
)、 SET GENERATED
以及SET
服從SQL標(biāo)準(zhǔn)。其他形式都是PostgreSQL對(duì)SQL標(biāo)準(zhǔn)的擴(kuò)展。此外,在單個(gè)sequence_option
ALTER TABLE
命令中指定多個(gè)操作的能力是一種擴(kuò)展。
ALTER TABLE DROP COLUMN
可以被用來(lái)刪除一個(gè)表的唯一的 列,從而留下一個(gè)零列的表。這是一種 SQL 的擴(kuò)展,SQL 中不允許零列的表。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: