PostgreSQL CREATE FOREIGN TABLE

2021-09-09 10:35 更新

CREATE FOREIGN TABLE — 定義一個(gè)新的外部表

大綱

CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name ( [  { column_name data_type [ OPTIONS ( option 'value' [, ... ] ) ] [ COLLATE collation ] [ column_constraint [ ... ] ]    | table_constraint }    [, ... ]] )[ INHERITS ( parent_table [, ... ] ) ]  SERVER server_name[ OPTIONS ( option 'value' [, ... ] ) ]

CREATE FOREIGN TABLE [ IF NOT EXISTS ] table_name  PARTITION OF parent_table [ (  { column_name [ WITH OPTIONS ] [ column_constraint [ ... ] ]    | table_constraint }    [, ... ]) ] partition_bound_spec  SERVER server_name[ OPTIONS ( option 'value' [, ... ] ) ]其中 column_constraint 是:

[ CONSTRAINT constraint_name ]{ NOT NULL |  NULL |  CHECK ( expression ) [ NO INHERIT ] |  DEFAULT default_expr |  GENERATED ALWAYS AS ( generation_expr ) STORED }table_constraint 是:
[ CONSTRAINT constraint_name ]CHECK ( expression ) [ NO INHERIT ]

描述

CREATE FOREIGN TABLE在當(dāng)前數(shù)據(jù)庫(kù)中創(chuàng)建 一個(gè)新的外部表。該表將由發(fā)出這個(gè)命令的用戶(hù)所擁有。

如果給定了一個(gè)模式名稱(chēng)(例如CREATE FOREIGN TABLE myschema.mytable ...),那么該表會(huì)被創(chuàng)建在指定的模式中。 否則它會(huì)被創(chuàng)建在當(dāng)前模式中。該外部表的名稱(chēng)必須與同一個(gè)模式中 的任何其他外部表、表、序列、索引、視圖或者物化視圖區(qū)分開(kāi)來(lái)。

CREATE FOREIGN TABLE還將自動(dòng)創(chuàng)建 一個(gè)數(shù)據(jù)類(lèi)型來(lái)表示該外部表行相應(yīng)的組合類(lèi)型。因此,外部表不能和 同一個(gè)模式中任何現(xiàn)有的數(shù)據(jù)類(lèi)型同名。

如果指定了PARTITION OF子句, 則該表被創(chuàng)建為具有指定邊界的parent_table的分區(qū)。

要?jiǎng)?chuàng)建一個(gè)外部表,你必須具有該外部服務(wù)器上的USAGE 特權(quán),以及該表中用到的所有列類(lèi)型上的USAGE特權(quán)。

參數(shù)

IF NOT EXISTS

已經(jīng)存在同名關(guān)系時(shí)不要拋出錯(cuò)誤。這種情況下會(huì)發(fā)出一個(gè)提示。注意, 并不保證已經(jīng)存在的關(guān)系與將要?jiǎng)?chuàng)建的那一個(gè)相似。

table_name

要?jiǎng)?chuàng)建的表的名稱(chēng)(可以被模式限定)。

column_name

要在新表中創(chuàng)建的列名。

data_type

該列的數(shù)據(jù)類(lèi)型。可以包括數(shù)組指示符。更多 PostgreSQL支持的數(shù)據(jù)類(lèi)型可見(jiàn)第 8 章。

COLLATE collation

COLLATE子句為該列(必須是一個(gè)可排序的數(shù)據(jù)類(lèi)型) 賦予一個(gè)排序規(guī)則。如果沒(méi)有指定,則會(huì)使用該列的數(shù)據(jù)類(lèi)型的默認(rèn) 排序規(guī)則。

INHERITS ( parent_table [, ... ] )

可選的INHERITS子句指定了一個(gè)表的列表,新的外部表 會(huì)自動(dòng)從中繼承所有列。父表可以是普通表或者外部表。詳見(jiàn) CREATE TABLE的類(lèi)似形式。

PARTITION OF parent_table FOR VALUES partition_bound_spec

此語(yǔ)句可以用來(lái)將外部表創(chuàng)建為父表的一個(gè)指定區(qū)間的分區(qū)表。 詳見(jiàn)CREATE TABLE的類(lèi)似形式。 注意如果父表存在UNIQUE類(lèi)型的索引時(shí),當(dāng)前是不允許將外部表 創(chuàng)建為該父表的分區(qū)表。(另見(jiàn) ALTER TABLE ATTACH PARTITION 。)

CONSTRAINT constraint_name

一個(gè)可選的用于列或者表約束的名字。如果該約束被違背,這個(gè)約束名字會(huì) 出現(xiàn)在錯(cuò)誤消息中,這樣col must be positive這種約束名就 可以被用來(lái)與客戶(hù)端應(yīng)用交流有用的約束信息(指定包含空格的約束名需要 使用雙引號(hào))。如果沒(méi)有指定約束名,系統(tǒng)會(huì)自動(dòng)生成一個(gè)。

NOT NULL

該列不允許包含空值。

NULL

該列可以包含空值,這是默認(rèn)值。

提供這個(gè)子句只是為了兼容非標(biāo)準(zhǔn)的 SQL 數(shù)據(jù)庫(kù)。在新的應(yīng)用中 不鼓勵(lì)使用它。

CHECK ( expression ) [ NO INHERIT ]

CHECK子句指定一個(gè)產(chǎn)生布爾結(jié)果的表達(dá)式,該外部表 中的每一行都應(yīng)該滿(mǎn)足該表達(dá)式。也就是說(shuō),對(duì)于該外部表中所有的行, 這個(gè)表達(dá)式應(yīng)該產(chǎn)生 TRUE 或者 UNKNOWN 而不能產(chǎn)生 FALSE。被 作為列約束指定的檢查約束應(yīng)該只引用該列的值,而出現(xiàn)在表約束中的 表達(dá)式可以引用多列。

當(dāng)前,CHECK表達(dá)式不能包含子查詢(xún),也不能 引用除當(dāng)前行的列之外的其他變量??梢砸孟到y(tǒng)列 tableoid,但是不能引用其他系統(tǒng)列。

被標(biāo)記為NO INHERIT的約束將不會(huì)傳播到子表上。

DEFAULT default_expr

DEFAULT子句為包含它的列定義賦予一個(gè)默認(rèn)數(shù)據(jù)值。該 值是任意不包含變量的表達(dá)式(不允許子查詢(xún)和對(duì)當(dāng)前表中其他列的交叉 引用)。默認(rèn)值表達(dá)式的數(shù)據(jù)類(lèi)型必須匹配列的數(shù)據(jù)類(lèi)型。

默認(rèn)值表達(dá)式將被用在任何沒(méi)有指定列值的插入操作中。如果一列沒(méi)有 默認(rèn)值,則默認(rèn)值為空值。

GENERATED ALWAYS AS ( generation_expr ) STORED

該子句創(chuàng)建一個(gè)生成列。 此列不能寫(xiě)入,只能在讀取時(shí)返回所指定的表達(dá)式的值。

關(guān)鍵字STORED是必須的,用來(lái)表明該列將在寫(xiě)入時(shí)計(jì)算。 (計(jì)算出的值將會(huì)傳遞給外部數(shù)據(jù)封裝器負(fù)責(zé)保存,并在讀取時(shí)返回。)

生成表達(dá)式可以引用表中的其他列,但不能引用其他的生成列。 所使用的函數(shù)和操作符必須是不可變。 不能引用其他表。

server_name

要用于該外部表的一個(gè)現(xiàn)有外部服務(wù)器的名稱(chēng)。有關(guān)定義一個(gè)服務(wù)器 的細(xì)節(jié)可以參考CREATE SERVER。

OPTIONS ( option 'value' [, ...] )

要與新外部表或者它的一個(gè)列相關(guān)聯(lián)的選項(xiàng)。被允許的選項(xiàng)名稱(chēng)和值是與 每一個(gè)外部數(shù)據(jù)包裝器相關(guān)的,并且它們會(huì)被該外部數(shù)據(jù)包裝器的驗(yàn)證器 函數(shù)驗(yàn)證。不允許重復(fù)的選項(xiàng)名稱(chēng)(不過(guò)一個(gè)表選項(xiàng)和一個(gè)列選項(xiàng)重名是 可以的)。

注解

PostgreSQL核心系統(tǒng)不會(huì)強(qiáng)制外部表上的約束( 例如CHECKNOT NULL子句),大部分外部 數(shù)據(jù)包裝器也不會(huì)嘗試強(qiáng)制它們。也就是說(shuō),這類(lèi)約束會(huì)被簡(jiǎn)單地認(rèn)為保持 為真。這種強(qiáng)制其實(shí)沒(méi)什么意義,因?yàn)樗贿m用于通過(guò)該外部表插入或者更 新的行,而對(duì)通過(guò)其他方式修改的行(例如直接在遠(yuǎn)程服務(wù)器上修改)沒(méi)有 作用。附著在外部表上的約束應(yīng)該表示由外部服務(wù)器強(qiáng)制的一個(gè)約束。

有些特殊目的的外部數(shù)據(jù)包裝器可能是它們所訪問(wèn)的數(shù)據(jù)的唯一一種訪問(wèn) 機(jī)制,在那種情況下讓外部數(shù)據(jù)包裝器自己來(lái)執(zhí)行約束強(qiáng)制可能是合適的。 但是不應(yīng)該假設(shè)包裝器會(huì)這樣做,除非它的文檔說(shuō)它會(huì)。

盡管PostgreSQL不會(huì)嘗試強(qiáng)制外部表上的約束, 但它確實(shí)假定它們對(duì)于查詢(xún)優(yōu)化的目的是正確的。如果在外部表中有不 滿(mǎn)足約束的行可見(jiàn),在該表上的查詢(xún)可能會(huì)產(chǎn)生不正確的回答。確保 約束定義符合實(shí)際是用戶(hù)的責(zé)任。

類(lèi)似的要點(diǎn)也適用于生成列。生成列在本地PostgreSQL 服務(wù)器發(fā)生插入或更新時(shí)進(jìn)行計(jì)算,并將計(jì)算結(jié)果傳遞給外部數(shù)據(jù)封裝器,由外部數(shù)據(jù) 封裝器負(fù)責(zé)把結(jié)果寫(xiě)到外部數(shù)據(jù)存儲(chǔ)中,但是并不強(qiáng)制要求查詢(xún)外部表時(shí)返回的生成列 的值一定是與生成表達(dá)式一致。 總而言之,此行為可能導(dǎo)致查詢(xún)到不正確的結(jié)果。

雖然列可以從本地分區(qū)移到外部表分區(qū)(使用的外部數(shù)據(jù)封裝器支持元組路由),但是 不能將列從外部表分區(qū)移動(dòng)到本地分區(qū)。

示例

創(chuàng)建外部表films,通過(guò)服務(wù)器film_server訪問(wèn)它:

CREATE FOREIGN TABLE films (
    code        char(5) NOT NULL,
    title       varchar(40) NOT NULL,
    did         integer NOT NULL,
    date_prod   date,
    kind        varchar(10),
    len         interval hour to minute
)
SERVER film_server;

創(chuàng)建外部表measurement_y2016m07,通過(guò)服務(wù)器 server_07訪問(wèn)它,作為范圍分區(qū)表measurement 的分區(qū):

CREATE FOREIGN TABLE measurement_y2016m07
    PARTITION OF measurement FOR VALUES FROM ('2016-07-01') TO ('2016-08-01')
    SERVER server_07;

兼容性

CREATE FOREIGN TABLE命令大部分符合 SQL標(biāo)準(zhǔn)。不過(guò),與 CREATE TABLE 很相似,它允許NULL約束以及零列外部表。能夠指定列默認(rèn)值 也是一種PostgreSQL擴(kuò)展。 PostgreSQL定義的表繼承形式是非標(biāo)準(zhǔn)的。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)