Provided by:
manpages-zh_1.5-1_all 
NAME
ALTER TABLE - 蚹麊磲漫w義
SYNOPSIS
ALTER TABLE [ ONLY ] name [ * ]
ADD [ COLUMN ] column type [ column_constraint [ ... ] ]
ALTER TABLE [ ONLY ] name [ * ]
DROP [ COLUMN ] column [ RESTRICT | CASCADE ]
ALTER TABLE [ ONLY ] name [ * ]
ALTER [ COLUMN ] column { SET DEFAULT expression | DROP DEFAULT }
ALTER TABLE [ ONLY ] name [ * ]
ALTER [ COLUMN ] column { SET | DROP } NOT NULL
ALTER TABLE [ ONLY ] name [ * ]
ALTER [ COLUMN ] column SET STATISTICS integer
ALTER TABLE [ ONLY ] name [ * ]
ALTER [ COLUMN ] column SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }
ALTER TABLE [ ONLY ] name [ * ]
SET WITHOUT OIDS
ALTER TABLE [ ONLY ] name [ * ]
RENAME [ COLUMN ] column TO new_column
ALTER TABLE name
RENAME TO new_name
ALTER TABLE [ ONLY ] name [ * ]
ADD table_constraint
ALTER TABLE [ ONLY ] name [ * ]
DROP CONSTRAINT constraint_name [ RESTRICT | CASCADE ]
ALTER TABLE name
OWNER TO new_owner
ALTER TABLE name
CLUSTER ON index_name
DESCRIPTIONyz
ALTER TABLE 變更一茞{存表的定義。它有好幾種子形式:
ADD COLUMN
這種形式用和 CREATE TABLE [create_table(7)]
裏一樣的語法向表中增加一虓s的字段。
DROP COLUMN
這種形式從表中刪除一茼r段。請注意,和這-
茼r段相關的索引和表約束也會被自動刪除。
如果任何表之外的對象依賴於這茼r段, 你必須說
CASCADE,比如,外鍵參考,視圖等等。
SET/DROP DEFAULT
這種形式為一茼r段設置或者刪除預設C請注意預設u應用於隨後的
INSERT 命令; 它怳ㄦ|導P已經在表中的行的數禍改。我-
怳]可以為視圖創建預設, 這荇尕它怓O在視圖的 ON INSERT
規則應用之前插入 INSERT 語句中去的。
SET/DROP NOT NULL
這些形式蚹鴾@茼r段是否標記為允許 NULL 峈怓O拒絕 NULL C
如果表在字段中包含非空A那麼你只可以 SET NOT NULL。
SET STATISTICS
This form
這荍峖′偯H後的 ANALYZE [analyze(7)] 操作設置每字段的統-
p收集目標。 目標的S圍可以在 0 到 1000 之內設置;另外,把他設置為
-1 則表示奐s恢復到使用系統預設的統p目標。
SET STORAGE
這種形式為一茼r段設置存儲模式。這茬]置控制這-
茼r段是內聯保存還是保存在一茠屬的表裏,以及數據是否n壓縮。
PLAIN 必需用於定長的數A比如 integer,並且是內聯的,不壓縮的。
MAIN 用於內聯,可壓縮的數據。 EXTERNAL
用於外部保存,不壓縮的數據, 而 EXTENDED 用於外部的壓縮數據。
EXTENDED 是所有支持它的數據的預設。 使用 EXTERNAL 將令在 text
字段上的子字串操作更快, 付出的代價是增加了存儲空間。
SET WITHOUT OIDS
從表中刪除 oid 字段。從表中刪除(設置為沒有)oid
同樣不會立即發生。 OID 使用的空間將在元組被更新的時-
啈^收。不更新元組的時唌A OID 的空間和數犖護都是不確定的。這-
蚢L程語義上類似 DROP COLUMN 過程。
RENAME RENAME 形式改變一茠磲漲W字(或者是一荅薑煄A一荍C,或者一-
茧纗洁^或者是表中一蚇W立字段的名字。
它對存儲的數據沒有任何影響。
ADD table_constraint
這荍峖△鼓篲W加一虓s的約束,用的語法和 CREATE TABLE
[create_table(7)] 一樣。
DROP CONSTRAINT
這荍峖“R除一茠矰W的約束。 目前,在表上的約束不-
n求有唯一的名字,因此可能有多茯蠽穭t聲明的名字。
所有這樣的約束都將被刪除。
OWNER 這荍峖“幭靰瞴A索引,序列或者視圖的所有者為指定所有者。
CLUSTER
這種形式為將來對表進行的 CLUSTER [cluster(7)] 操作做標記。
n使用 ALTER TABLE,你必需擁有該表; 除了 ALTER TABLE OWNER
之外,它只能由超級使用者執行。
PARAMETERS數
name 試圖更改的現存表(可能有模式袡╮^的名稱。 如果聲明了
ONLY,則只更改該表。 如果沒有聲明
ONLY,則該表及其所有後代表(如果有)都被更新。 我-
怚i以在表名字後悸加一 *
表示後代表都被掃描,但是在目前的版本裏,這是預設行為。
(在7.1之前的版本,ONLY 是預設的行為。)預設可以通過改變配置選項
SQL_INHERITANCE 來改變。
column 現存或新的字段名稱。
type 新字段的類型。
new_column
新字段的類型。
new_name
表的新名稱。
table_constraint
表的新的約束定義。
constraint_name
n刪除的現有約束的名字。
new_owner
該表的新所有者的使用者名。
index_name
n標記為建簇的表上悸滲薑犌W字。
CASCADE
自動刪除依賴於被依賴字段或者約束的對象(比如,引用該字段的視圖)。
RESTRICT
如果字段或者約束還有任何依賴的對象,則拒絕刪除該字段。
這是預設行為。
NOTES`N
COLUMN 關鍵字是多餘的,可以省略。
在目前的 ADD COLUMN實現裏還不支持新列/字段的預設(^和 NOT NULL
子句。 新字段開始存在時所有ㄛO NULL。 不過你可以隨後用 ALTER TABLE 的
SET DEFAULT 形式設置預設(^。(你可能還想用 UPDATE [update(7)]
把已存在行更新為預設C) 如果你想標記該字段為非
null,在你為該字段的所有行輸入非 null 妨嵽 SET NOT NULL。
DROP COLUMN 命令並不是物理上把字段刪除, 而只是簡單地把它標記為 SQL
操作中不可見的。隨後對該表的插入和更新將在該字段存儲一 NULL。
因此,刪除一-
茼r段是很快的,但是它不會立即縮減你的表在磁碟上的大小,因為被刪除了的字段佔據的空間還沒有回收。
這些空間將隨著現有的行的更新而得到回收。n立即回收空間, 我怚i以做一-
紖PDATE所有行的假動作,然後立即 vacuum, 像這樣:
UPDATE table SET col = col;
VACUUM FULL table;
如果表有任何後代表,那麼如果不在後代表上做同樣的蚹麊爾隉A
就不允許在父表上增加或者咿R名一茼r段,也就是說, ALTER TABLE
ONLY將被拒絕。這樣就保証了後代表總是有和父表匹配的字段。
一蚖撢kDROP COLUMN
操作將只有在後代表並不從任何其它父表中繼承該字段並且從來沒有獨立定義該字段的時-
啎~能刪除一茷嵽N表的字段。 一茷D遞歸的DROP COLUMN(也就是,ALTER TABLE
ONLY ... DROP COLUMN)從來不會刪除任何後代字段, 而是把他-
抯訄O為獨立定義的,而不是繼承的。
不允許更改系統表結構的任何部分。
請參考CREATE TABLE 部分獲取更多有效參數的描z。 Chapter 5 ``Data
Definition'' 裏有更多有關繼承的信息。
EXAMPLESl
向表中增加一 varchar 列:
ALTER TABLE distributors ADD COLUMN address varchar(30);
從表中刪除一茼r段:
ALTER TABLE distributors DROP COLUMN address RESTRICT;
對現存列改名:
ALTER TABLE distributors RENAME COLUMN address TO city;
更改現存表的名字︰
ALTER TABLE distributors RENAME TO suppliers;
給一茼r段增加一茷D空約束:
ALTER TABLE distributors ALTER COLUMN street SET NOT NULL;
從一茼r段裏刪除一茷D空約束:
ALTER TABLE distributors ALTER COLUMN street DROP NOT NULL;
給一茠篲W加一蚗邠d約束:
ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5);
刪除一茠磼M它的所有子表的監查約束:
ALTER TABLE distributors DROP CONSTRAINT zipchk;
向表中增加一茈~鍵約束:
ALTER TABLE distributors ADD CONSTRAINT distfk FOREIGN KEY (address) REFERENCES addresses (address) MATCH FULL;
給表增加一荂]多字段)唯一約束:
ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode);
給一茠篲W加一茼菾囥R名的主鍵約束,n注意的是一茠磳u能有一茈D鍵:
ALTER TABLE distributors ADD PRIMARY KEY (dist_id);
COMPATIBILITYe性
ADD COLUMN 形式是相容 SQL 標準的, 除了上掩〞犒w設(^和 NOT NULL
約束外。 ALTER COLUMN 形式是完全相容的。
咿R名表,列/字段,索引,和序列的名字是 PostgreSQL 對 SQL 的擴展。
ALTER TABLE DROP COLUMN 可以用於刪除表中的唯一的一茼r段, 留下一-
蚢s字段的表。這是對 SQL 的擴展,它不允許零字段表。
者
Postgresql <laser@pgsqldb.org>