PostgreSQL修改表結構

來源:互聯網
上載者:User

標籤:

5.5. 修改表
如果你建立了一個表後發現自己犯了一個錯誤,或者是應用的需求 發生了變化,那麼你可以刪除這個表然後重新建立它。但是如果這個 表已經填充了好多資料了,或者是該表已經被其它資料庫物件引用, (比如一個外鍵約束) 那這可不是一個方便的選項。因此 PostgreSQL 提供了一族命令用於修改現有表。 請注意它在概念上和修改一個表中包含的資料是不一樣的: 這裡我們感興趣的是修改一個表的定義,或者說結構。

你可以增加欄位,刪除欄位,增加約束,刪除約束,修改預設值,修改欄位資料類型,重新命名欄位,重新命名表。

 

 

所有這些動作都是用 ALTER TABLE 命令執行的。

5.5.1. 增加欄位
要增加一個欄位,使用下面這樣的命令:

ALTER TABLE products ADD COLUMN description text;新增的欄位對於表中已經存在的行而言最初將先填充所給出的預設值 (如果你沒有聲明DEFAULT子句,那麼預設是空值)。

你也可以同時在該欄位上定義約束,使用通常的文法:

ALTER TABLE products ADD COLUMN description text CHECK (description <> ‘‘);實際上,所有在 CREATE TABLE 裡描述的可以應用於欄位之選項都可以在這裡使用。 不過,我們要注意的是預設值必須滿足給出的約束,否則 ADD 將會失敗。 另外,你可以在你正確填充了新欄位的數值之後再增加約束(見下文)。

5.5.2. 刪除欄位
要刪除一個欄位,使用下面這樣的命令:

ALTER TABLE products DROP COLUMN description;不管欄位裡有啥資料,都會小時。和這個欄位相關的約束也會被刪除。 不過,如果這個欄位被另外一個表的外鍵所引用,PostgreSQL 則不會隱含地刪除該約束。你可以通過使用 CASCADE 來授權刪除任何依賴該欄位的東西:

ALTER TABLE products DROP COLUMN description CASCADE;參閱 Section 5.11 擷取有關這些操作背後的機制的資訊。

5.5.3. 增加約束
要增加一個約束,使用資料表條件約束文法。比如:

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;
這個約束將立即進行檢查,所以表在添加約束之前必須符合約束條件。

5.5.4. 刪除約束
要刪除一個約束,你需要知道它的名字。如果你給了它一個名字, 那麼事情就好辦了。否則系統會分配一個產生的名字,這樣你就需要 把它找出來了。psql 的命令 /d tablename 在這兒可以幫忙; 其它介面可能也提供了檢查表的細節的方法。然後就是這條命令:

ALTER TABLE products DROP CONSTRAINT some_name;(如果你在處理一個產生的約束名,比如 $2,別忘了你需要給它 添加雙引號,讓它成為一個有效標識符。)

和刪除欄位一樣,如果你想刪除有著被依賴關係地約束,你需要用 CASCADE。 一個例子是某個外鍵約束依賴被引用欄位上的唯一約束或者主鍵約束。

除了非空約束外,所有約束類型都這麼用。要刪除非空類型,用

ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;(要記得非空約束沒有名字。)

5.5.5. 改變一個欄位的預設值
要給一個欄位設定預設值,使用一個象下面這樣的命令:

ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;請注意這麼做不會影響任何錶中現有的資料行, 它只是為將來 INSERT 命令改變預設值。

要刪除預設值,用

ALTER TABLE products ALTER COLUMN price DROP DEFAULT;這樣實際上相當於把預設設定為空白。 結果是,如果我們刪除一個還沒有定義的預設值不算錯誤,因為預設隱含就是空值。

5.5.6. 修改一個欄位的資料類型
把一個欄位轉換成另外一種資料類型,使用下面的命令:

ALTER TABLE products ALTER COLUMN price TYPE numeric(10,2);只有在欄位裡現有的每個項都可以用一個隱含的類型轉換轉換城新的類型時才可能成功。 如果需要更複雜的轉換,你可以增加一個 USING 子句,它聲明如何從舊值裡計算新值。

PostgreSQL 將試圖把欄位的預設值(如果存在)轉換成新的類型, 還有涉及該欄位的任何約束。但是這些轉換可能失敗,或者可能產生奇怪的結果。 在修改某欄位類型之前,你最好刪除那些約束,然後再把自己手工修改過的添加上去。

5.5.7. 給欄位改名字
重新命名一個欄位:

ALTER TABLE products RENAME COLUMN product_no TO product_number;
5.5.8. 給欄位改名字
給一個欄位重新命名:

ALTER TABLE products RENAME COLUMN product_no TO product_number;
5.5.9. 給表改名字
給一個表重新命名:

ALTER TABLE products RENAME TO items;

摘自:http://blog.csdn.net/joulegates/article/details/1534699

PostgreSQL修改表結構

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.