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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM