2017-06-08 98 views
1

插入/更新後,我有this數據庫,我需要回答以下問題:PostgreSQL觸發插入table1中一個新的記錄表2中

「你需要有這將是函數一起創建觸發器當觸發器被觸發時執行,每次檢查患者並進行診斷(如果插入的約會診斷不爲空),患者的醫療文件夾將被更新。

這是我想出了:

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作爲患者的身份證件。它也可以是有耐心的,但不是,按照我老師的指導原則。

PS2。醫療文件夾表可以包括同一患者的重複記錄。所以,我不需要用病人的id(patientamka)更新記錄,我只需要插入一個新的記錄。

回答

1

這更是一個代碼審查的問題,因爲我承擔上述工程,但無論如何:

appointmentsFunction()

在PG命名約定snake_case而不是駝峯。也不需要將「功能」一詞添加到您的功能中。稱之爲描述其功能的東西。

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

最後,如果BEGINDECLAREEND的縮進位置相同,那將是很不錯的選擇。

相關問題