Postgresql 如何编辑导致唯一性冲突的记录并将更改回送到子表?
PostgreSQL 11.1 如何将记录的“编辑”传输到从属记录 我的问题摘要:Postgresql 如何编辑导致唯一性冲突的记录并将更改回送到子表?,postgresql,database-design,triggers,Postgresql,Database Design,Triggers,PostgreSQL 11.1 如何将记录的“编辑”传输到从属记录 我的问题摘要: 主表disease在description列上需要唯一的约束。外键在更新级联到其子表时需要此唯一约束 要允许临时违反唯一约束,必须将其设置为可延迟。但外键中不能使用可延迟约束 情况是这样的 该数据库有100多个表(并在不断增长) 大多数信息都已规范化,因为重复的信息组已委托给它们自己的表 在标准化之后,大多数表都是没有重复记录的列表。不允许在表中重复记录 所有表都为每个记录分配了唯一的ID(除了记录信息上的
- 主表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
感谢您提供的帮助。您有一个外键引用,该外键引用的描述字符串可能会更改?那么您的数据库设计很糟糕。该字符串应该只在数据库中存在一次。是什么阻止您在更新列之前删除冲突项?@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"