ALTER FOREIGN TABLE — 變更外部資料表的定義
ALTER FOREIGN TABLE [ IF EXISTS ] [ ONLY ]name
[ * ]action
[, ... ] ALTER FOREIGN TABLE [ IF EXISTS ] [ ONLY ]name
[ * ] RENAME [ COLUMN ]column_name
TOnew_column_name
ALTER FOREIGN TABLE [ IF EXISTS ]name
RENAME TOnew_name
ALTER FOREIGN TABLE [ IF EXISTS ]name
SET SCHEMAnew_schema
whereaction
is one of: ADD [ COLUMN ]column_name
data_type
[ COLLATEcollation
] [column_constraint
[ ... ] ] DROP [ COLUMN ] [ IF EXISTS ]column_name
[ RESTRICT | CASCADE ] ALTER [ COLUMN ]column_name
[ SET DATA ] TYPEdata_type
[ COLLATEcollation
] ALTER [ COLUMN ]column_name
SET DEFAULTexpression
ALTER [ COLUMN ]column_name
DROP DEFAULT ALTER [ COLUMN ]column_name
{ SET | DROP } NOT NULL ALTER [ COLUMN ]column_name
SET STATISTICSinteger
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
'] [, ... ]) ADDtable_constraint
[ NOT VALID ] VALIDATE CONSTRAINTconstraint_name
DROP CONSTRAINT [ IF EXISTS ]constraint_name
[ RESTRICT | CASCADE ] DISABLE TRIGGER [trigger_name
| ALL | USER ] ENABLE TRIGGER [trigger_name
| ALL | USER ] ENABLE REPLICA TRIGGERtrigger_name
ENABLE ALWAYS TRIGGERtrigger_name
SET WITHOUT OIDS INHERITparent_table
NO INHERITparent_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
這些形式設定或移除欄位的預設值。 預設值僅適用於後續的 INSERT
或 UPDATE
指令;它們不會導致資料表中已有的列發生變化。
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
'] [, ... ] )
變更外部資料表或其其中一個欄位的選項。 ADD
、SET
和 DROP
指定要執行的動作。 如果未明確指定任何操作,則假定為 ADD
。 不允許重複的選項名稱(儘管資料表選項和欄位選項具有相同的名稱是可以的)。 選項名稱和值也會使用外部資料包裝函式庫進行驗證。
RENAME
RENAME
形式會變更外部資料表的名稱或外部資料表中個別欄位的名稱。
SET SCHEMA(設定綱要)
此表單將外部資料表移動到另一個綱要。
除了 RENAME
和 SET 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 COLUMN
或 DROP COLUMN
新增或刪除欄位、新增 NOT NULL
或 CHECK
約束,或使用 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);
ADD
、DROP
和 SET DATA TYPE
形式符合 SQL 標準。 其他形式是 PostgreSQL 的 SQL 標準擴充功能。 此外,在單一 ALTER FOREIGN TABLE
指令中指定多個操作的功能也是一種擴充功能。
ALTER FOREIGN TABLE DROP COLUMN
可用於刪除外部資料表的唯一欄位,從而留下零欄位資料表。 這是 SQL 的擴充功能,它不允許零欄位外部資料表。
如果您在文件中發現任何不正確、與您特定功能的使用體驗不符或需要進一步澄清之處,請使用此表單來回報文件問題。