PostgreSQL
上一頁   下一頁

ALTER TABLE

名稱

ALTER TABLE ─ 更改表屬性

ALTER TABLE table [ * ]
    ADD [ COLUMN ] column type
ALTER TABLE table [ * ]
    ALTER [ COLUMN ] column { SET DEFAULT value | DROP DEFAULT }
ALTER TABLE table [ * ]
    RENAME [ COLUMN ] column TO newcolumn
ALTER TABLE table
    RENAME TO newtable
  

輸入

table
試圖更改的現存表的名稱。
column
現存或新的列名稱。
type
新列的型態。
newcolumn
現存列的新名稱。
newtable
表的新名稱。

輸出

ALTER
從被更名的列或表返回的資訊。
ERROR
如果一個列或表不存在返回的資訊。

描述

ALTER TABLE 變更一個現存表的定義。ADD COLUMN 形式用與 CREATE TABLE 一樣的語法向表中增加一個新列/字段。ALTER COLUMN 形式允許你從列/字段中設置或者刪除預設(值)。注意預設(值)只對新插入的行有效。RENAME 子句可以在不影響相關表刈酚何數據的情況下更改一個表或者列/字段的名稱。因此,表或列/字段在此命令執行後仍將是相同尺寸和型態。

如果要改變表的屬性,你必須是表的所有者。

注意

COLUMN 關鍵字是多餘的,可以省略。

如果“*” 跟在一個表名後面,表示該命令要對該表和所有繼承級別低於該表的表進行操作﹔預設時,該屬性(更改)不會增加到任何子表或修改任何子表的相關名稱。當增加或修改一個超級表(譯注:繼承級別高的表)的屬性時總是應該這樣的。否則,像下面這樣的在繼承級上進行的查詢

SELECT NewColumn FROM SuperClass*
    

將不能工作,因為子表會比超級表少一個屬性。

在目前的實現裡,新列/字段的預設(值)和約束子句會被忽略。你可以隨後用 ALTER TABLESET DEFAULT 形式設置預設(值)。(你還不得不用 UPDATE 把已存在行更新為預設值。)

要修改表的結構,你必須是表的所有人。不允許更改系統表結構的任何部分。PostgreSQL 用戶手冊 裡有關於繼承的更多資訊。

請參考 CREATE TABLE 部分獲取更多有效參數的描述。

用法

向表中增加一個 VARCHAR 列:

ALTER TABLE distributors ADD COLUMN address VARCHAR(30);
   

對現存列改名:

ALTER TABLE distributors RENAME COLUMN address TO city;
   

對現存表改名:

ALTER TABLE distributors RENAME TO suppliers;
   

兼容性

SQL92

ADD COLUMN 形式是兼容的,除了上面說的預設(值)和約束外。ALTER COLUMN 形式是完全兼容的。

SQL92 對 ALTER TABLE 聲明了一些附加的Postgres目前還不支援的功能:

ALTER TABLE table ADD table constraint definition
ALTER TABLE table DROP CONSTRAINT constraint { RESTRICT | CASCADE }
      
增加或刪除表的約束(比如像檢查約束,唯一約束或外鍵約束)。要創建或刪除一個唯一約束,對應地創建或刪除一個唯一索引(參閱 CREATE INDEX )。要修改其他型態的約束,你需要重建和重載該表,使用 CREATE TABLE 的其他參數。

例如,刪除表 distributors 的任何約束:

CREATE TABLE temp AS SELECT * FROM distributors;
DROP TABLE distributors;
CREATE TABLE distributors AS SELECT * FROM temp;
DROP TABLE temp;
       
ALTER TABLE table DROP [ COLUMN ] column { RESTRICT | CASCADE }
      
當前,要刪除一個現存的列,表必須重新創建和重新裝載:
CREATE TABLE temp AS SELECT did, city FROM distributors;    
DROP TABLE distributors;
CREATE TABLE distributors (
    did      DECIMAL(3)  DEFAULT 1,
    name     VARCHAR(40) NOT NULL,
);
INSERT INTO distributors SELECT * FROM temp;
DROP TABLE temp;
       

重命名列/字段和表名是 PostgreSQL 擴展。SQL92 沒有提供這些。


上一頁 首頁 下一頁
ALTER GROUP 開頭 ALTER USER