ALTER TABLE(7) | SQL Commands | ALTER TABLE(7) |
ALTER TABLE - 修改表的定義
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
ALTER TABLE 變更一個現存表的定義。它有好幾種子形式:
要使用 ALTER
TABLE,你必需擁有該表;
除了 ALTER TABLE OWNER
之外,它只能由超級使用者執行。
COLUMN 關鍵字是多餘的,可以省略。
在目前的 ADD
COLUMN實現裡還不支援新列/欄位的預設(值)和
NOT NULL 子句。
新欄位開始存在時所有值都是
NULL。
不過你可以隨後用 ALTER TABLE
的 SET DEFAULT
形式設定預設(值)。(你可能還想用
UPDATE [update(7)]
把已存在行更新為預設值。)
如果你想標記該欄位為非
null,在你為該欄位的所有行輸入非
null 值之後用 SET NOT NULL。
DROP COLUMN 命令並不是物理上把欄位刪除, 而只是簡單地把它標記為 SQL 操作中不可見的。隨後對該表的插入和更新將在該欄位儲存一個 NULL。 因此,刪除一個欄位是很快的,但是它不會立即縮減你的表在磁碟上的大小,因為被刪除了的欄位佔據的空間還沒有回收。 這些空間將隨著現有的行的更新而得到回收。要立即回收空間, 我們可以做一個UPDATE所有行的假動作,然後立即 vacuum, 象這樣:
UPDATE table SET col = col; VACUUM FULL table;
如果表有任何後代表,那麼如果不在後代表上做同樣的修改的話,
就不允許在父表上增加或者重新命名一個欄位,也就是說,
ALTER TABLE
ONLY將被拒絕。這樣就保證了後代表總是有和父表匹配的欄位。
一個遞迴DROP COLUMN
操作將只有在後代表並不從任何其它父表中繼承該欄位並且從來沒有獨立定義該欄位的時候才能刪除一個後代表的欄位。
一個非遞迴的DROP
COLUMN(也就是,ALTER TABLE ONLY ... DROP
COLUMN)從來不會刪除任何後代欄位,
而是把他們標記為獨立定義的,而不是繼承的。
不允許更改系統表結構的任何部分。
請參考CREATE TABLE
部分獲取更多有效引數的描述。
Chapter 5 ``Data Definition''
裡有更多有關繼承的資訊。
向表中增加一個 varchar 列:
ALTER TABLE distributors ADD COLUMN address varchar(30);
從表中刪除一個欄位:
ALTER TABLE distributors DROP COLUMN address RESTRICT;
對現存列改名:
ALTER TABLE distributors RENAME COLUMN address TO city;
更改現存表的名字∶
ALTER TABLE distributors RENAME TO suppliers;
給一個欄位增加一個非空約束:
ALTER TABLE distributors ALTER COLUMN street SET NOT NULL;
ALTER TABLE distributors ALTER COLUMN street DROP NOT NULL;
給一個表增加一個檢查約束:
ALTER TABLE distributors ADD CONSTRAINT zipchk CHECK (char_length(zipcode) = 5);
刪除一個表和它的所有子表的監查約束:
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);
給一個表增加一個自動命名的主鍵約束,要注意的是一個表只能有一個主鍵:
ALTER TABLE distributors ADD PRIMARY KEY (dist_id);
ADD COLUMN 形式是相容 SQL 標準的, 除了上面說的預設(值)和 NOT NULL 約束外。 ALTER COLUMN 形式是完全相容的。
重命名錶,列/欄位,索引,和序列的名字是
PostgreSQL 對 SQL 的擴充套件。
ALTER TABLE DROP COLUMN 可以用於刪除表中的唯一的一個欄位, 留下一個零欄位的表。這是對 SQL 的擴充套件,它不允許零欄位表。
Postgresql 中文網站 何偉平 <laser@pgsqldb.org>
本頁面中文版由中文
man 手冊頁計劃提供。
中文 man
手冊頁計劃:https://github.com/man-pages-zh/manpages-zh
2003-11-02 | SQL - Language Statements |