PostgreSQL: back-up table 与 parent 的 ID 不同

PostgreSQL: back-up table has different ID from parent

我们在 PostgreSQL 中使用 DO ALSO RULEs 来创建审计(历史)tables。

我注意到,当我有一个 SERIAL 列时,值在 parent 和审计 table 之间“共享”(因此您不能使用JOIN tables).

的值

我通过审核 tables 与 CREATE TABLE abc AS SELECT * FROM def...

如何确保 SERIAL 列在两个 table 之间具有相同的值?

编辑,这里是完整的测试用例

第 1 步 - 创建 parenttable(要审计/历史跟踪的那个)

CREATE TABLE audit_testing_parent (
    id SERIAL PRIMARY KEY,
    varchar_col1 VARCHAR NOT NULL,
    varchar_col2 VARCHAR NOT NULL,
    int_col INTEGER,
    created_on TIMESTAMP DEFAULT NOW()
);

第 2 步 - 插入一些数据

INSERT INTO audit_testing_parent(varchar_col1, varchar_col2, int_col)
VALUES ('test01','test01',1);

第 3 步 - 创建审计 table

CREATE TABLE audit_testing_audit
AS SELECT 'INSERT' audit_Type, NOW() audit_time, a.*
   FROM audit_testing_parent a
;

第 4 步 - 创建规则来审核 parent 的数据

create rule audit_testing_parent_on_insert as on insert to audit_testing_parent do also
insert into audit_testing_audit
(
    audit_type,
    audit_time,
    id,
    varchar_col1,
    varchar_col2,
    int_col,
    created_on
)
values
(
'INSERT',
now(),
    new.id,
    new.varchar_col1,
    new.varchar_col2,
    new.int_col,
    new.created_on
);

第 4 步 - 通过执行另一个 INSERT

来测试规则
INSERT INTO audit_testing_parent(varchar_col1, varchar_col2, int_col)
VALUES ('test02','test02',2);

parent table 现在看起来像这样:

审核 table 如下所示:

注意 ID 列中的差异。

在parenttable所在的行int_col = 2id = 2

但是在同一行审计table(int_col = 2),id = 3

如何确保 RULE 处理 SERIAL 列,以便两个 table 在 ID 列中具有相同的值?

那是行不通的,因为那不是规则的运作方式。如果您将 nextval('someseq') 插入您的主 table,该规则将对审计 table 执行相同的操作,因此您将获得下一个序列值。

解决方案不是为此使用规则,而是使用触发器。