Provided by: manpages-zh_1.6.3.6-1_all bug

NAME

       ALTER TABLE - 修改表的定義

SYNOPSIS

       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

DESCRIPTION 描述

       ALTER TABLE 變更一個現存表的定義。它有好幾種子形式:

       ADD COLUMN
               這種形式用和 CREATE TABLE [create_table(7)]  裡一樣的語法向表中增加一個新的欄位。

       DROP COLUMN
               這種形式從表中刪除一個欄位。請注意,和這個欄位相關的索引和表約束也會被自動刪除。
              如果任何表之外的物件依賴於這個欄位, 你必須說 CASCADE,比如,外來鍵參考,檢視等等。

       SET/DROP DEFAULT
               這種形式為一個欄位設定或者刪除預設值。請注意預設值只應用於隨後的 INSERT 命令;  它
              們不會導致已經在表中的行的數值的修改。我們也可以為檢視建立預設, 這個時候它們是在檢
              視的 ON INSERT 規則應用之前插入 INSERT 語句中去的。

       SET/DROP NOT NULL
               這些形式修改一個欄位是否標記為允許 NULL 值或者是拒絕 NULL 值。  如果表在欄位中包含
              非空值,那麼你只可以 SET NOT NULL。

       SET STATISTICS
              This form
               這個形式為隨後的  ANALYZE [analyze(7)] 操作設定每欄位的統計收集目標。 目標的範圍可
              以在 0 到 1000 之內設定;另外,把他設定為  -1  則表示重新恢復到使用系統預設的統計目
              標。

       SET STORAGE
               這種形式為一個欄位設定儲存模式。這個設定控制這個欄位是內聯儲存還是儲存在一個附屬的
              表裡,以及資料是否要壓縮。 PLAIN 必需用於定長的數值,比如 integer,並且是內聯的,不
              壓縮的。  MAIN  用於內聯,可壓縮的資料。  EXTERNAL  用於外部儲存,不壓縮的資料, 而
              EXTENDED 用於外部的壓縮資料。 EXTENDED 是所有支援它的資料的預設。 使用 EXTERNAL  將
              令在 text 欄位上的子字串操作更快, 付出的代價是增加了儲存空間。

       SET WITHOUT OIDS
               從表中刪除 oid 欄位。從表中刪除(設定為沒有)oid 同樣不會立即發生。 OID 使用的空間
              將在元組被更新的時候回收。不更新元組的時候, OID 的空間和數值的維護都是不確定的。這
              個過程語義上類似 DROP COLUMN  過程。

       RENAME RENAME 形式改變一個表的名字(或者是一個索引,一個序列,或者一個檢視)或者是表中一個
              獨立欄位的名字。 它對儲存的資料沒有任何影響。

       ADD table_constraint
               這個形式給表增加一個新的約束,用的語法和 CREATE TABLE [create_table(7)] 一樣。

       DROP CONSTRAINT
               這個形式刪除一個表上的約束。  目前,在表上的約束不要求有唯一的名字,因此可能有多個
              約束匹配宣告的名字。 所有這樣的約束都將被刪除。

       OWNER
               這個形式改變表,索引,序列或者檢視的所有者為指定所有者。

       CLUSTER
               這種形式為將來對錶進行的 CLUSTER [cluster(7)] 操作做標記。

        要使用  ALTER  TABLE,你必需擁有該表;  除了 ALTER TABLE OWNER 之外,它只能由超級使用者執
       行。

PARAMETERS 引數

       name
               試圖更改的現存表(可能有模式修飾)的名稱。 如果聲明瞭 ONLY,則只更改該表。  如果沒
              有宣告  ONLY,則該表及其所有後代表(如果有)都被更新。 我們可以在表名字後面附加一個
              * 表示後代表都被掃描,但是在目前的版本里,這是預設行為。 (在7.1之前的版本,ONLY 是
              預設的行為。)預設可以透過改變配置選項 SQL_INHERITANCE 來改變。

       column
               現存或新的欄位名稱。

       type
               新欄位的型別。

       new_column
               新欄位的型別。

       new_name
               表的新名稱。

       table_constraint
               表的新的約束定義。

       constraint_name
               要刪除的現有約束的名字。

       new_owner
               該表的新所有者的使用者名稱。

       index_name
               要標記為建簇的表上面的索引名字。

       CASCADE
               自動刪除依賴於被依賴欄位或者約束的物件(比如,引用該欄位的檢視)。

       RESTRICT
               如果欄位或者約束還有任何依賴的物件,則拒絕刪除該欄位。 這是預設行為。

NOTES 注意

        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''  裡有更多有
       關繼承的資訊。

EXAMPLES 例子

        向表中增加一個 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);

COMPATIBILITY 相容性

       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