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
然后完成查询(需要正确的语法)。 (请参阅此处
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`对于解决方案来说不是必需的。