我有this数据库,我需要回答以下问题:
"您需要创建一个触发器以及触发触发器时将执行的函数。每次检查患者并且有诊断时(如果插入的预约诊断为非空),患者的医疗文件夹将被更新。"
这就是我的想法:
CREATE OR REPLACE FUNCTION appointmentsFunction()
RETURNS TRIGGER AS $appointmentsfunction$
DECLARE
appointment_patientamka BIGINT := new.patientamka;
appointment_cure TEXT := new.cure;
appointment_drug_id INT := drug_id;
appointment_diagnosis TEXT := new.diagnosis;
BEGIN
IF appointment_diagnosis is NOT NULL THEN
INSERT INTO public.medicalfolder (patient,cure,drug_id) VALUES (appointment_patientamka,appointment_cure, appointment_drug_id);
END IF;
RETURN NEW;
END
$appointmentsfunction$
LANGUAGE plpgsql;
这是最好的做法/最佳方式吗?
PS。 patientamka用作患者的ID。根据我老师的指导原则,它也可以是patientID,但不是。
PS2。医疗文件夹表可以包括同一患者的重复记录。所以,我不需要用患者的身份证(患者身份证)来更新记录,我只需要插入一个新记录。
答案 0 :(得分:1)
这更像是一个Code Review问题,因为我假设上述工作,但无论如何:
appointmentsFunction()
PG中的命名约定是snake_case而不是camelCase。也无需附加单词" function"你的功能。称之为描述它的作用的东西。
DECLARE appointment_patientamka BIGINT := new.patientamka; appointment_cure TEXT := new.cure; appointment_drug_id INT := drug_id; appointment_diagnosis TEXT := new.diagnosis;
我有两个问题。
首先,您要花费将值分配给四个变量的成本(成本很小,但不是免费的)。然后检查其中一个是否为NULL,如果是,则不要使用这些值 - 因此您浪费了阅读和分配所有这些变量的工作。
第二件事是这些变量都不是必需的,因为你可以检查NEW.diagnosis
是否为NULL,如果没有,则将值(直接从NEW读取)插入medicalfolder
。
最后,将BEGIN
放在与DECLARE
和END
相同的缩进上会很高兴。