Postgresql触发器在table2中插入/更新后在table1中插入新记录

时间:2017-06-08 14:06:41

标签: postgresql function triggers insert

我有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。医疗文件夹表可以包括同一患者的重复记录。所以,我不需要用患者的身份证(患者身份证)来更新记录,我只需要插入一个新记录。

1 个答案:

答案 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放在与DECLAREEND相同的缩进上会很高兴。