我试图将表与逻辑复制同步。这需要涵盖插入、更新和删除。但是,复制仅适用于 Insert 而不是其余的。
如此处所述
已发布的表必须配置“副本标识”,以便能够复制 UPDATE 和 DELETE 操作,以便可以在订阅方识别要更新或删除的适当行。
这是发布表的架构
CREATE TABLE mytest.point_a (
gid serial NOT NULL PRIMARY KEY,
the_value numeric(10,2),
name TEXT NOT NULL,
geom geometry(Point,4326) );
CREATE INDEX test_point_a_geom_idx
ON mytest.point_a USING gist (geom);
ALTER TABLE mytest.point_a REPLICA IDENTITY DEFAULT;
我试图复制的上表有 REPLICA IDENTITY 子句和一个序列整数列作为主键。订阅表中的对应列只是一个没有序列的普通 bigint。
这是订阅表:
CREATE TABLE mytest.point_a (
gid bigint,
--column order is different, this is on purpose
name TEXT,
address TEXT, --not exists in publishing
geom geometry, --more flexible than the one in publishing
the_value(10,2)
);
--this one does not have index
所有插入都被复制,但更新和删除不是。
那么这里缺少什么?我是否错误地添加了 REPLICA IDENTITY?
另一个相关问题:我们如何知道(发布)表是否有 REPLICA IDENTITY 子句?在 pgAdmin III 和 DBeaver 中,上面我的发布表的 DDL 视图没有显示任何提示。
在副本上添加主键约束,
gid
以便可以识别行。表的默认值
REPLICA IDENTITY
记录在ALTER TABLE
:也就是说,默认设置在副本具有与源表相同的主键的假设下记录足够的数据。
如果您在表上没有主键或唯一索引,您可以使用它的所有
REPLICA IDENTITY FULL
列来标识一行,但如果您有重复的行,您仍然会遇到麻烦(删除其中一个在primary 将删除备用数据库上的所有内容)。我认为这不是一件聪明的事情,所有表都应该有一个主键。