?
This document uses PHP Chinese website manual Release
如果你創(chuàng)建了一個表后發(fā)現(xiàn)自己犯了一個錯誤,或者是應用的需求發(fā)生了變化, 那么你可以刪除這個表然后重新創(chuàng)建它。但是如果這個表已經(jīng)填充了許多數(shù)據(jù), 或者該表已經(jīng)被其它數(shù)據(jù)庫對象引用(比如一個外鍵約束),那這可不是一個方 便的方法。因此PostgreSQL提供了一族命令用于修改現(xiàn)有表。請注意它在概 念上和修改一個表中包含的數(shù)據(jù)是不一樣的:這里我們感興趣的是修改一個表 的定義,或者說結構。
你可以:
增加字段
刪除字段
增加約束
刪除約束
改變?nèi)笔≈?/p>
修改字段數(shù)據(jù)類型
重命名字段
重命名表
所有這些動作都是用 ALTER TABLE 命令執(zhí)行的。
要增加一個字段,使用下面這樣的命令:
ALTER TABLE products ADD COLUMN description text;
新增的字段對于表中已經(jīng)存在的行而言最初將先填充所給出的缺省值 (如果你沒有聲明DEFAULT子句,那么缺省是NULL)。
你也可以同時在該字段上定義約束,使用通常的語法:
ALTER TABLE products ADD COLUMN description text CHECK(description <> '');
實際上,所有在CREATE TABLE里描述的可以應用于字段的選項 都可以在這里使用。不過,我們要注意的是缺省值必須滿足給出的約束,否則ADD將會失敗。另外,你可以在正確填充了新字段的數(shù)值之后 再增加約束(見下文)。
Tip: 添加一個字段并填充缺省值將會導致更新表中的所有行(為了存儲新字段的值), 但如果沒有聲明缺省值,PostgreSQL就可以 避免物理更新。所以如果你將要在新字段中填充的值大多數(shù)都不等于缺省值, 那么最好添加一個沒有缺省值的字段,然后再使用UPDATE更新數(shù)據(jù), 最后使用下面的方法添加缺省值。
要刪除一個字段,使用下面這樣的命令:
ALTER TABLE products DROP COLUMN description;
不管字段里有啥數(shù)據(jù),都會消失,和這個字段相關的約束也會被刪除。不過, 如果這個字段被另一個表的外鍵所引用,PostgreSQL 則不會隱含地刪除該約束。你可以通過使用CASCADE指明刪除任何依 賴該字段的東西:
ALTER TABLE products DROP COLUMN description CASCADE;
參閱Section 5.11獲取有關這些操作背后的機制的信息。
要增加一個約束,必須使用表約束語法。比如:
ALTER TABLE products ADD CHECK (name <> ''); ALTER TABLE products ADD CONSTRAINT some_name UNIQUE (product_no); ALTER TABLE products ADD FOREIGN KEY (product_group_id) REFERENCES product_groups;
要增加一個不能寫成表約束的非空約束,使用下面的語法:
ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;
這個約束將立即進行檢查,所以表在添加約束之前必須符合約束條件。
要刪除一個約束,你需要知道它的名字。如果你曾經(jīng)給了它取了名字,那么事情 就很簡單。否則你就需要找出系統(tǒng)自動分配的名字。psql的命令 \d tablename可以這個幫忙;其它接口 可能也提供了檢查表的細節(jié)的方法。然后就是這條命令:
ALTER TABLE products DROP CONSTRAINT some_name;
如果你在處理一個生成的約束名,比如$2, 別忘了你需要給它添加雙引號,讓它成為一個有效的標識符。
和刪除字段一樣,如果你想刪除被依賴的約束,你需要用CASCADE。 一個例子是某個外鍵約束依賴被引用字段上的唯一約束或者主鍵約束。
除了非空約束外,所有約束類型都這么用。要刪除非空約束,可以這樣:
ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;
要記得非空約束沒有名字。
要給一個字段設置缺省值,可以使用一個像下面這樣的命令:
ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;
請注意這么做不會影響任何表中現(xiàn)有的數(shù)據(jù)行,它只是為將來的INSERT 命令改變?nèi)笔≈?
要刪除缺省值,可以用
ALTER TABLE products ALTER COLUMN price DROP DEFAULT;
這樣實際上相當于把缺省設置為空。結果是,如果我們刪除一個還沒有 定義的缺省值不算錯誤,因為缺省隱含就是NULL
把一個字段轉換成另外一種數(shù)據(jù)類型,使用下面的命令:
ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);
只有在字段里現(xiàn)有的每個項都可以隱含的轉換成新類型時才可能成功。 如果需要更復雜的轉換,你可以增加一個USING子句, 它聲明如何從舊值里計算新值。
PostgreSQL將試圖把字段的缺省值(如果存在)轉換成新的類型, 還有涉及該字段的任何約束。但是這些轉換可能失敗,或者可能生成奇怪的結果。 在修改某字段類型之前,你最好刪除那些約束,然后再把合適的約束添加上去。
重命名一個字段:
ALTER TABLE products RENAME COLUMN product_no TO product_number;
重命名一個表:
ALTER TABLE products RENAME TO items;