当两条记录都已存在时,如何修复从不正确的父记录到另一条记录的外键引用? (PostgreSQL 14)

问题描述 投票:0回答:1

PostgreSQL 14

总结:以下模式有多个可能拼写错误的文本字符串(专业、医生姓名、办公室名称)。

挑战:如何将外键从“现有”拼写错误的记录正确更改为另一个(拼写正确的)“现有”记录。存在独特的约束并且存在多个子表。 我有以下表格布局: CREATE TABLE specialties ( specialtyid SERIAL PRIMARY KEY, specialty text not null unique check (specialty <> '') ); CREATE TABLE Doctors ( doctorid SERIAL PRIMARY KEY, doctorname text not null UNIQUE CHECK (doctorname <> ''), specialtyid integer not null, CONSTRAINT doctors_specialty_fk FOREIGN KEY (specialtyid) REFERENCES specialties (specialtyid) MATCH SIMPLE ON UPDATE RESTRICT ON DELETE RESTRICT ); CREATE TABLE Offices ( officeid SERIAL PRIMARY KEY, officename text not null CHECK (officename <> '') UNIQUE ); CREATE TABLE staff ( staffid SERIAL PRIMARY KEY, officeid integer not null, doctorid integer not null, CONSTRAINT staff_unique UNIQUE(officeid,doctorid), CONSTRAINT staff_office_fk FOREIGN KEY (officeid) REFERENCES offices (officeid) MATCH SIMPLE ON UPDATE RESTRICT ON DELETE RESTRICT, CONSTRAINT staff_doctor_fk FOREIGN KEY (doctorid) REFERENCES doctors (doctorid) MATCH SIMPLE ON UPDATE RESTRICT ON DELETE RESTRICT ); CREATE TABLE Referrals ( referralid SERIAL PRIMARY KEY, officeid integer, doctorid integer, specialtyid integer, CONSTRAINT referrals_office_fk FOREIGN KEY (officeid) REFERENCES offices (officeid) MATCH SIMPLE ON UPDATE RESTRICT ON DELETE RESTRICT, CONSTRAINT referrals_doctor_fk FOREIGN KEY (doctorid) REFERENCES doctors (doctorid) MATCH SIMPLE ON UPDATE RESTRICT ON DELETE RESTRICT, CONSTRAINT referrals_specialty_fk FOREIGN KEY (specialtyid) REFERENCES specialties (specialtyid) MATCH SIMPLE ON UPDATE RESTRICT ON DELETE RESTRICT ); CREATE TABLE orders ( orderid SERIAL PRIMARY KEY, encounterid integer NOT NULL, referralid integer, CONSTRAINT orders_pkey PRIMARY KEY (orderid), CONSTRAINT referral_unique UNIQUE (encounterid, referralid), CONSTRAINT orders_referral_fk FOREIGN KEY (referralid) REFERENCES referrals (referralid) MATCH SIMPLE ON UPDATE RESTRICT ON DELETE RESTRICT )

订单表已大大简化。

可以看出,总体思路是每个专科可以有多名医生,一名医生可以在一个或多个办公室。推荐订单
将参考转诊记录,该记录可以是办公室、医生或专科的转诊记录。

我无法放弃的是如何管理医生、专业或办公室拼写错误的字符串。也就是说,假设它们是专业领域的两个记录 第一个是“Noorosurgery”,第二个是“Neurosurgery”。每条记录都通过系统向下链接 适当的医生、员工记录、办公室、转介和命令。

现在,稍后的某个时间,拼写错误的单词将被更正为“Neurosurgery”。这会立即引发错误(理应如此),神经外科是 不再独特。当然,这可以推迟到情况解决为止,但是如何才能向下发送正确的记录参考 通过树以便正确更改与所有子项的所有链接?此外,这是否可以自动化,以便如果添加更多子表,则不需要进一步更改?

@ErwinBrandstetter

使用外键“合并”Postgres 表中的两行

很接近,但不是同一个问题。

在我之前的尝试中,我基本上在事务中创建了一个迷宫般的临时表,并将约束设置为延迟。我是 PostgreSQL 14 的新手,希望有更好的方法。 (我使用的是 PostgreSQL 9)。 一定有更好的方法。

感谢您的考虑。

您可以通过单个查询来完成此操作;采取多个步骤进行教唆。首先创建一个 CTE,用于检索拼写错误和正确拼写的

specialtyid
postgresql merge constraints
1个回答
0
投票
什么都不做选择

然后完成查询(需要正确的语法)。 (请参阅此处

domo,您没有提供数据,所以我只是生成了一些)。
specialties
注意:表格-- Apply corrections with corrections(old_spec, new_spec) as ( select o.specialtyid, n.specialtyid from specialties o join specialties n on (o.specialty = 'Noorosurgery' and n.specialty = 'Neurosurgery') or (o.specialty = 'Opthalmology' and n.specialty = 'Ophthalmology') ) , do_doc as ( update doctors set specialtyid = new_spec from corrections where specialtyid = old_spec --returning new_spec ) , do_ref as ( update referrals set specialtyid = new_spec from corrections where specialtyid = old_spec --returning new_spec ) select null; staffoffices1,

orders`对于解决方案来说不是必需的。
    

© www.soinside.com 2019 - 2024. All rights reserved.