2025年9月25日: PostgreSQL 18 釋出!
支援的版本: 當前 (18)
開發版本: devel

29.6. 生成列複製 #

通常,訂閱者上的表會與釋出者表定義相同,因此如果釋出者表具有GENERATED 列,則訂閱者表也會有一個匹配的生成列。在這種情況下,始終使用訂閱者表的生成列值。

例如,請注意下面訂閱者表中的生成列值來自訂閱者列的計算。

/* pub # */ CREATE TABLE tab_gen_to_gen (a int, b int GENERATED ALWAYS AS (a + 1) STORED);
/* pub # */ INSERT INTO tab_gen_to_gen VALUES (1),(2),(3);
/* pub # */ CREATE PUBLICATION pub1 FOR TABLE tab_gen_to_gen;
/* pub # */ SELECT * FROM tab_gen_to_gen;
 a | b
---+---
 1 | 2
 2 | 3
 3 | 4
(3 rows)

/* sub # */ CREATE TABLE tab_gen_to_gen (a int, b int GENERATED ALWAYS AS (a * 100) STORED);
/* sub # */ CREATE SUBSCRIPTION sub1 CONNECTION 'dbname=test_pub' PUBLICATION pub1;
/* sub # */ SELECT * from tab_gen_to_gen;
 a | b
---+----
 1 | 100
 2 | 200
 3 | 300
(3 rows)

事實上,在 18.0 版本之前,邏輯複製根本不釋出 GENERATED 列。

但是,有時將生成列複製到常規列可能是有益的。

提示

當透過輸出外掛將資料複製到非 PostgreSQL 資料庫時,此功能可能很有用,尤其是在目標資料庫不支援生成列的情況下。

生成列預設不釋出,但使用者可以選擇像常規列一樣釋出儲存的生成列。

有兩種方法可以做到這一點:

  • PUBLICATION 引數 publish_generated_columns 設定為 stored。這會指示 PostgreSQL 邏輯複製釋出釋出者表中當前和將來的儲存的生成列。

  • 指定表列列表,以明確指定將釋出哪些儲存的生成列。

    注意

    在確定將釋出哪些表列時,列列表具有優先權,會覆蓋 publish_generated_columns 引數的效果。

下表總結了邏輯複製涉及生成列時的行為。結果顯示了未啟用釋出生成列以及啟用釋出生成列時的情況。

表 29.2. 複製結果摘要

釋出生成列? 釋出者表列 訂閱者表列 結果
GENERATED GENERATED 釋出者表列未複製。使用訂閱者表的生成列值。
GENERATED regular 釋出者表列未複製。使用訂閱者表常規列的預設值。
GENERATED --missing-- 釋出者表列未複製。無操作。
GENERATED GENERATED 錯誤。不支援。
GENERATED regular 釋出者表列值已複製到訂閱者表列。
GENERATED --missing-- 錯誤。該列在訂閱者表中被報告為缺失。

警告

目前不支援包含多個釋出者,其中同一個表被髮布者具有不同的列列表。請參閱 第 29.5 節

如果一個釋出者正在釋出生成列,而同一訂閱中的另一個釋出者沒有為同一個表釋出生成列,那麼也會發生同樣的情況。

注意

如果訂閱者來自 18 版本之前的版本,那麼即使生成列在釋出者中定義,初始表同步也不會複製生成列。

提交更正

如果您在文件中看到任何不正確、與您對特定功能的體驗不符或需要進一步澄清的內容,請使用此表單來報告文件問題。