支援的版本:目前 (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 相同。 目前僅支援 CHECK 約束。

與將約束新增至常規資料表的情況不同,不會執行任何操作來驗證約束是否正確; 相反,此動作僅聲明應假定某些新條件對外部資料表中的所有列都成立。 (請參閱 CREATE FOREIGN TABLE 中的討論。)如果約束標記為 NOT VALID,則不假定它成立,而僅記錄以供將來可能使用。

VALIDATE CONSTRAINT

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

DROP CONSTRAINT [ IF EXISTS ]

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

DISABLE/ENABLE [ REPLICA | ALWAYS ] 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 的擴充功能,它不允許零欄位外部資料表。

提交更正

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