W3Cschool
恭喜您成為首批注冊(cè)用戶(hù)
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
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)。
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)制外部表上的約束( 例如CHECK
或NOT 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)的。
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: