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