2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18) / 17 / 16 / 15 / 14 / 13
開發版本: devel
不支援的版本: 12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1

ALTER FOREIGN TABLE

ALTER FOREIGN TABLE — 更改外部表的定義

概要

ALTER FOREIGN TABLE [ IF EXISTS ] [ ONLY ] name [ * ]
    action [, ... ]
ALTER FOREIGN TABLE [ IF EXISTS ] [ ONLY ] name [ * ]
    RENAME [ COLUMN ] column_name TO new_column_name
ALTER FOREIGN TABLE [ IF EXISTS ] name
    RENAME TO new_name
ALTER FOREIGN TABLE [ IF EXISTS ] name
    SET SCHEMA new_schema

where action is one of:

    ADD [ COLUMN ] column_name data_type [ COLLATE collation ] [ column_constraint [ ... ] ]
    DROP [ COLUMN ] [ IF EXISTS ] column_name [ RESTRICT | CASCADE ]
    ALTER [ COLUMN ] column_name [ SET DATA ] TYPE data_type [ COLLATE collation ]
    ALTER [ COLUMN ] column_name SET DEFAULT expression
    ALTER [ COLUMN ] column_name DROP DEFAULT
    ALTER [ COLUMN ] column_name { SET | DROP } NOT NULL
    ALTER [ COLUMN ] column_name SET STATISTICS integer
    ALTER [ COLUMN ] column_name SET ( attribute_option = value [, ... ] )
    ALTER [ COLUMN ] column_name RESET ( attribute_option [, ... ] )
    ALTER [ COLUMN ] column_name SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN | DEFAULT }
    ALTER [ COLUMN ] column_name OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ])
    ADD table_constraint [ NOT VALID ]
    VALIDATE CONSTRAINT constraint_name
    DROP CONSTRAINT [ IF EXISTS ]  constraint_name [ RESTRICT | CASCADE ]
    DISABLE TRIGGER [ trigger_name | ALL | USER ]
    ENABLE TRIGGER [ trigger_name | ALL | USER ]
    ENABLE REPLICA TRIGGER trigger_name
    ENABLE ALWAYS TRIGGER trigger_name
    SET WITHOUT OIDS
    INHERIT parent_table
    NO INHERIT parent_table
    OWNER TO { new_owner | CURRENT_ROLE | CURRENT_USER | SESSION_USER }
    OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ])

描述

ALTER FOREIGN TABLE 更改現有外部表的定義。有幾種子形式。

ADD COLUMN

此形式向外部表新增一個新列,語法與 CREATE FOREIGN TABLE 相同。與向常規表新增列不同,此操作不會影響底層儲存:此操作只是宣告有一個新列現在可以透過外部表訪問。

DROP COLUMN [ IF EXISTS ]

此形式從外部表中刪除一個列。如果外部表的其他物件依賴於該列(例如檢視),則需要指定 CASCADE。如果指定了 IF EXISTS 並且列不存在,則不會引發錯誤。在這種情況下,會發出通知。

SET DATA TYPE

此形式更改外部表列的資料型別。同樣,這不會影響任何底層儲存:此操作只是更改 PostgreSQL 認為該列具有的資料型別。

SET/DROP DEFAULT

這些形式設定或刪除列的預設值。預設值僅適用於後續的 INSERTUPDATE 命令;它們不會導致表中已有的行發生更改。

SET/DROP NOT NULL

標記一個列允許或不允許 NULL 值。

SET STATISTICS

此形式為後續的 ANALYZE 操作設定每個列的統計資訊收集目標。有關更多詳細資訊,請參閱 ALTER TABLE 的類似形式。

SET ( attribute_option = value [, ... ] )
RESET ( attribute_option [, ... ] )

此形式設定或重置每個屬性的選項。有關更多詳細資訊,請參閱 ALTER TABLE 的類似形式。

SET STORAGE

此形式設定列的儲存模式。有關更多詳細資訊,請參閱 ALTER TABLE 的類似形式。請注意,儲存模式不會產生任何影響,除非表的外部資料包裝器選擇關注它。

ADD table_constraint [ NOT VALID ]

此形式向外部表新增一個新約束,語法與 CREATE FOREIGN TABLE 相同。目前只支援 CHECKNOT NULL 約束。

與向常規表新增約束不同,此操作不會驗證約束是否正確;相反,此操作只是宣告應該假設外部表中的所有行都滿足某個新條件。(請參閱 CREATE FOREIGN TABLE 中的討論。)如果約束被標記為 NOT VALID(僅適用於 CHECK 情況),則不假設它成立,而僅記錄下來以備將來使用。

VALIDATE CONSTRAINT

此形式將之前被標記為 NOT VALID 的約束標記為有效。不會採取任何行動來驗證約束,但將來的查詢將假定它成立。

DROP CONSTRAINT [ IF EXISTS ]

此形式刪除外部表上的指定約束。如果指定了 IF EXISTS 並且約束不存在,則不會引發錯誤。在這種情況下,會發出通知。

DISABLE/ENABLE [ REPLICA | ALWAYS ] TRIGGER

這些形式配置外部表所屬觸發器(trigger)的觸發。有關更多詳細資訊,請參閱 ALTER TABLE 的類似形式。

SET WITHOUT OIDS

用於刪除 oid 系統列的相容性語法。由於 oid 系統列已無法新增,此操作永遠不會產生任何效果。

INHERIT parent_table

此形式將目標外部表新增為指定父表的新子表。有關更多詳細資訊,請參閱 ALTER TABLE 的類似形式。

NO INHERIT parent_table

此形式將目標外部表從指定父表的子表列表中移除。

OWNER

此形式將外部表的所有者更改為指定使用者。

OPTIONS ( [ ADD | SET | DROP ] option ['value'] [, ... ] )

更改外部表或其某個列的選項。ADDSETDROP 指定要執行的操作。如果沒有顯式指定操作,則假定為 ADD。不允許重複的選項名稱(儘管表選項和列選項具有相同的名稱是允許的)。選項名稱和值也會使用外部資料包裝器庫進行驗證。

RENAME

RENAME 形式更改外部表的名稱或外部表中單個列的名稱。

SET SCHEMA

此形式將外部表移動到另一個模式。

RENAMESET SCHEMA 外,所有操作都可以組合成一個多重修改列表,以並行應用。例如,可以在單個命令中新增多個列和/或更改多個列的型別。

如果命令寫為 ALTER FOREIGN TABLE IF EXISTS ... 並且外部表不存在,則不會引發錯誤。在這種情況下會發出通知。

要使用 ALTER FOREIGN TABLE,您必須擁有該表。要更改外部表的模式,您還必須對新模式具有 CREATE 許可權。要更改所有者,您必須能夠 SET ROLE 到新的所有者角色,並且該角色必須對錶的模式具有 CREATE 許可權。(這些限制確保更改所有者不會執行您透過刪除和重新建立表而無法完成的操作。但是,超級使用者可以更改任何表的歸屬。)要新增列或更改列型別,您還必須對資料型別具有 USAGE 許可權。

引數

name

要更改的現有外部表的名稱(可選擇性地帶模式限定)。如果表名稱前指定了 ONLY,則只更改該表。如果未指定 ONLY,則更改該表及其所有子表(如果存在)。可選地,可以在表名稱後指定 * 以明確表示包含子表。

column_name

新列或現有列的名稱。

new_column_name

現有列的新名稱。

new_name

表的新名稱。

data_type

新列的資料型別,或現有列的新資料型別。

table_constraint

外部表的新表約束。

constraint_name

要刪除的現有約束的名稱。

CASCADE

自動刪除依賴於被刪除列或約束的物件(例如,引用該列的檢視),以及依賴於這些物件的物件(參見 第 5.15 節)。

RESTRICT

如果存在任何依賴物件,則拒絕刪除列或約束。這是預設行為。

trigger_name

要停用或啟用的單個觸發器的名稱。

ALL

停用或啟用外部表所屬的所有觸發器。(如果任何觸發器是內部生成的觸發器,則需要超級使用者許可權。核心系統不會向外部表新增此類觸發器,但附加程式碼可能會這樣做。)

USER

停用或啟用外部表所屬的所有觸發器,但內部生成的觸發器除外。

parent_table

要與此外部表關聯或取消關聯的父表。

new_owner

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

new_schema

將表移動到的模式的名稱。

註釋

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

在使用 ADD COLUMNDROP COLUMN 新增或刪除列、新增 NOT NULLCHECK 約束,或者使用 SET DATA TYPE 更改列型別時,不會檢查與外部伺服器的一致性。使用者有責任確保表定義與遠端端匹配。

有關有效引數的進一步說明,請參閱 CREATE FOREIGN TABLE

示例

將列標記為非空

ALTER FOREIGN TABLE distributors ALTER COLUMN street SET NOT NULL;

更改外部表的選項

ALTER FOREIGN TABLE myschema.distributors OPTIONS (ADD opt1 'value', SET opt2 'value2', DROP opt3);

相容性

ADDDROPSET DATA TYPE 形式符合 SQL 標準。其他形式是 PostgreSQL 對 SQL 標準的擴充套件。此外,在一個 ALTER FOREIGN TABLE 命令中指定多個操作的能力也是一種擴充套件。

ALTER FOREIGN TABLE DROP COLUMN 可用於刪除外部表的唯一列,從而留下一個零列的表。這是 SQL 的一個擴充套件,SQL 不允許零列的外部表。

提交更正

如果您在文件中發現任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用 此表單 報告文件問題。