Postgresql 如何编辑导致唯一性冲突的记录并将更改回送到子表?

Postgresql 如何编辑导致唯一性冲突的记录并将更改回送到子表?,postgresql,database-design,triggers,Postgresql,Database Design,Triggers,PostgreSQL 11.1 如何将记录的“编辑”传输到从属记录 我的问题摘要: 主表disease在description列上需要唯一的约束。外键在更新级联到其子表时需要此唯一约束 要允许临时违反唯一约束,必须将其设置为可延迟。但外键中不能使用可延迟约束 情况是这样的 该数据库有100多个表(并在不断增长) 大多数信息都已规范化,因为重复的信息组已委托给它们自己的表 在标准化之后,大多数表都是没有重复记录的列表。不允许在表中重复记录 所有表都为每个记录分配了唯一的ID(除了记录信息上的

PostgreSQL 11.1

如何将记录的“编辑”传输到从属记录

我的问题摘要:

  • 主表disease在description列上需要唯一的约束。外键在更新级联到其子表时需要此唯一约束
  • 要允许临时违反唯一约束,必须将其设置为可延迟。但外键中不能使用可延迟约束
情况是这样的

  • 该数据库有100多个表(并在不断增长)
  • 大多数信息都已规范化,因为重复的信息组已委托给它们自己的表
  • 在标准化之后,大多数表都是没有重复记录的列表。不允许在表中重复记录
  • 所有表都为每个记录分配了唯一的ID(除了记录信息上的唯一约束)
  • 大多数表都依赖于另一个表。外键引用它们所依赖的表的主键
  • 大多数唯一约束都涉及一个外键(它反过来引用父表的主键)
因此,假设以下模式:

CREATE TABLE phoenix.disease
(
    recid integer NOT NULL DEFAULT nextval('disease_recid_seq'::regclass),
    code text COLLATE pg_catalog."default",
    description text COLLATE pg_catalog."default" NOT NULL,
    CONSTRAINT disease_pkey PRIMARY KEY (recid),
    CONSTRAINT disease_code_unique UNIQUE (code)

        DEFERRABLE,
    CONSTRAINT disease_description_unique UNIQUE (description)
,
    CONSTRAINT disease_description_check CHECK (description <> ''::text)
)

CREATE TABLE phoenix.dx
(
    recid integer NOT NULL DEFAULT nextval('dx_recid_seq'::regclass),
    disease_recid integer NOT NULL,
    patient_recid integer NOT NULL,
    CONSTRAINT pk_dx_recid PRIMARY KEY (recid),
    CONSTRAINT dx_unique UNIQUE (tposted, patient_recid, disease_recid)
,
    CONSTRAINT dx_disease_recid_fkey FOREIGN KEY (disease_recid)
        REFERENCES phoenix.disease (recid) MATCH SIMPLE
        ON UPDATE CASCADE
        ON DELETE RESTRICT,
    CONSTRAINT dx_patients FOREIGN KEY (patient_recid)
        REFERENCES phoenix.patients (recid) MATCH SIMPLE
        ON UPDATE CASCADE
        ON DELETE RESTRICT
)
我已尝试延迟疾病表的主键,以便允许将“正确”ID“级联”到子表。这会导致以下错误:

  • 外键不能依赖于延迟列。无法对引用的表“disease”使用可延迟的唯一约束
  • 此外,父表(disease)无法提前知道其子表是否已经引用了“正确”记录,从而允许删除,或者子表是否需要更改自己的列数据以反映新的“正确”id
那么,我如何允许更改父表(disease)并通知子表更改它们的列值,以及在出现重复记录时删除它们自己的列值呢

最后,我今天不知道我将来需要什么表,所以我不能“预编码”到父表中,它的子表是谁或将是谁


感谢您提供的帮助。

您有一个外键引用,该外键引用的描述字符串可能会更改?那么您的数据库设计很糟糕。该字符串应该只在数据库中存在一次。是什么阻止您在更新列之前删除冲突项?@LaurenzAlbe我希望没有任何问题--我将尝试一下,然后继续e它是如何工作的。谢谢。您有一个外键引用到一个可以更改的描述字符串?那么您的数据库设计很糟糕。该字符串应该只在数据库中存在一次。是什么阻止您在更新列之前删除冲突项?@LaurenzAlbe我希望没有什么--我将尝试一下,看看它是如何工作的。T汉克斯。
Example:
Disease Table:
    record 1:  ID = 1    description = "ABC"
    record 2:  ID = 2    description = "DEF"

Dx Table:
    record 5:  ID = 5   refers to ID=1 of Disease Table.

Editing of record 1 in Disease table results in description becoming "DEF"
Disease Table:
    record 1:  ID = 1   "ABC" --> "DEF"