問題的簡短描述
我需要構建一個磁區表“用戶”,其中 2 個磁區位于不同的服務器(莫斯科和漢堡)上,每個磁區都是帶有列的表:
id- 整數主鍵自動遞增
region- smallint 磁區鍵,漢堡等于 100 或 200對于莫斯科
login- 長度為 100 的獨特字符。
我打算讓序列id作為n*1000 100漢堡和n*1000 200莫斯科,所以只是看熱鬧的主鍵,我會知道它屬于哪個磁區。
region 旨在只讀并且在創建后永遠不會更改,因此不會在磁區之間移動任何記錄。
SELECT查詢必須能夠從所有磁區回傳記錄,UPDATE查詢必須能夠修改所有磁區上的記錄,INSERT/DELETE查詢必須能夠僅向本地磁區添加/洗掉記錄,因此存盤在其中的資料不是完全隔離的。
做了什么
使用 pgAdmin4
- 我在漢堡服務器上創建了一個“測驗”表,添加了所有列資訊,將其標記為帶有磁區鍵
region和磁區型別的磁區表List。 - 我在這個表中創建了一個“漢堡”磁區,將主鍵約束添加為
id,將region唯一鍵約束添加為login,region。 - 我在莫斯科服務器上創建了一個“莫斯科”表,列資訊與“測驗”相同
- 我
postgres_fdw為漢堡服務器添加了擴展,創建了指向莫斯科服務器和用戶映射上的資料庫的外部服務器。 - 我向漢堡服務器添加了“莫斯科”外部表,指向莫斯科服務器上的“莫斯科”表。
我的問題是什么
我無法弄清楚如何將此外部表作為第二個磁區附加到“測驗”表。
當我嘗試attach通過“測驗”表磁區屬性中的 pgAdmin 對話框進行磁區時,它顯示了一個錯誤:cannot unpack non-iterable Response object
當我嘗試使用查詢添加磁區時,如下所示:
ALTER TABLE public.test ATTACH PARTITION public.moscow FOR VALUES IN (200);
它向我顯示了一個錯誤:
ERROR: cannot attach foreign table "moscow" as partition of partitioned table "test"
DETAIL: Table "test" contains unique indexes.
SQL state: 42809
我從login列中洗掉了唯一約束,但它顯示了相同的錯誤。
當我創建具有相同屬性的磁區表并且最初位于同一服務器上的兩個磁區都運行良好時,除了 postgres 觀察login每個磁區的唯一性而不是整個表的唯一性,但我建議這是它的限制。
那么,如何將位于第二臺服務器上的表作為磁區附加到位于第一臺服務器上的磁區表?
uj5u.com熱心網友回復:
錯誤資訊非常清楚:由于您無法在磁區表上創建索引,因此 PostgreSQL 無法創建唯一索引的磁區。但是需要唯一索引來實作約束。
請參閱此源評論:
/*
* If we're attaching a foreign table, we must fail if any of the indexes
* is a constraint index; otherwise, there's nothing to do here. Do this
* before starting work, to avoid wasting the effort of building a few
* non-unique indexes before coming across a unique one.
*/
要么洗掉唯一約束,要么不使用外部表作為磁區。
uj5u.com熱心網友回復:
好的,我終于能夠將外部表作為磁區添加到磁區表。
- 有必要洗掉磁區表的列上的
primary key屬性id和unique屬性login - 之后,我能夠將外部表作為磁區附加到磁區表
- 后來我為每個本地磁區添加了
primary key屬性 onid和列上的unique屬性。login
所以最后我有唯一的全域,id因為它是由每個資料庫的序列生成的,從未有過相交的值。為了login唯一性,我必須在插入之前手動檢查全域表是否有任何記錄。
PS 希望 postgres 中的這種磁區機制適用于地理上較遠的地區。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/331688.html
標籤:PostgreSQL 分片 外国表
上一篇:如何使用查詢構建器從子查詢更新?
