| PostgreSQL 7.4 文檔 | ||||
|---|---|---|---|---|
| Prev | Fast Backward | Chapter 5. 數據定義 | Fast Forward | Next |
如果你創建了一個表後發現自己犯了一些錯誤,或者是應用的需求 發生了變化,那麼你可以刪除這個表然後重新創建它。但是如果這個 表已經填充了好多數據了,或者是該表已經被其它數據庫對象引用, (比如一個外鍵約束) 那這可不是一個方便的選項。因此 PostgreSQL 提供了一族命令用于修改現有表。
你可以
增加字段,
刪除字段,
增加約束,
刪除約束,
修改缺省值,
重命名字段,
重命名表。
所有這些動作都是用 ALTER TABLE命令執行的。
要增加一個字段,使用這條命令:
ALTER TABLE products ADD COLUMN description text;
新增的字段對于表中已經存在的行而言最初將先填充空值。
你也可以同時在該字段上定義約束,使用通常的語法:
ALTER TABLE products ADD COLUMN description text CHECK (description <> '');
一個新字段不能用非空約束,因為最初的時候該字段必須包含空值。 但是你可以稍後增加一個非空約束。同樣,你也不能在一個新字段 上定義缺省值。根據 SQL 標準的說明,這樣需要對現存行的新 字段填充缺省值,而這個特性還沒有實現。但是你可以稍後調整 字段缺省。
要增加一個約束,使用表約束語法。比如:
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;
這個約束將立即進行檢查,所以表在添加約束之前必須符合約束條件。
要刪除一個約束,你需要知道它的名字。如果你給了它一個名字, 那麼事情就好辦了。否則系統會分配一個生成的名字,這樣你就需要 把它找出來了。psql 的命令 \d tablename 在這兒可以幫忙; 其它接口可能也提供了檢查表的細節的方法。然後就是這條命令:
ALTER TABLE products DROP CONSTRAINT some_name;
(如果你在處理一個生成的約束名,比如 $2,別忘了你需要給它 添加雙引號,讓它成為一個有效的標識符。)
除了非空約束外,所有約束類型都這麼用。要刪除非空類型,用
ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;
(要記得非空約束沒有名字。)
要給一個字段設置缺省值,使用一個象下面這樣的命令:
ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;
要刪除缺省值,用
ALTER TABLE products ALTER COLUMN price DROP DEFAULT;
這樣相當于把缺省設置為空,至少在 PostgreSQL裡是這樣的。 結果是,如果我們刪除一個還沒有定義的缺省值不算錯誤,因為缺省隱含就是空值。