Heim > Fragen und Antworten > Hauptteil
Das Folgende ist die Definition der Patiententabelle:
Patients table Columns: PatientId int AI PK FirstName longtext LastName longtext Email longtext NIC longtext Phone longtext Address longtext City longtext Country longtext DOB datetime(6) Gender longtext Reference longtext SerialNumberYear smallint SerialNumber int DoctorId int CreatedOn datetime(6) UpdatedOn datetime(6) CreatedBy longtext SMS_Allowed tinyint(1) Email_Allowed tinyint(1) SpecialConcern1 longtext SpecialConcern2 longtext SpecialConcern3 longtext SpecialConcern4 longtext CustomYearlyId longtext YearlyId int
Ich habe den folgenden Trigger für diese Tabelle in MySQL:
CREATE TRIGGER generate_yearly_id BEFORE INSERT ON clinic.patients FOR EACH ROW BEGIN DECLARE last_id INTEGER default 10; DECLARE current_year DATE; DECLARE yearly_id INTEGER default 0; IF NEW.CustomYearlyId IS NULL THEN BEGIN INSERT INTO DEBUG VALUES (null,"start trigger"); #SET @last_id := (SELECT max(yearlyid) FROM patients WHERE # YEAR(createdon)=YEAR(CURDATE())); IF last_id IS NOT NULL THEN BEGIN SET @yearly_id = 1; INSERT INTO DEBUG VALUES (null, concat("in if lastid is not null ",@yearly_id)); END; ELSE BEGIN #SET @yearly_id := 1; END; END IF; SET NEW.yearlyid := @yearly_id; END; END IF; END;// delimiter ;
Anweisung SET @yearly_id = 1;
工作正常。但是如果我将其更改为 SET @yearly_id = @last_id;
, der Trigger schlägt fehl. Was habe ich bei dieser Aufgabe falsch gemacht? last_id hat einen Standardwert. Muss ich ihn also initialisieren?
P粉5485126372024-04-03 00:09:22
下面的代码可以完美运行。不同之处是 1. 变量在使用前已被初始化。显然默认值是不够的。 1. 在“if”条件中使用了计数,而不是测试“is null”。
CREATE TRIGGER generate_yearly_id BEFORE INSERT ON clinic.patients FOR EACH ROW BEGIN DECLARE last_id INTEGER default 0; DECLARE current_year DATE; DECLARE yearly_id INTEGER default 1; declare count INTEGER default 0; IF NEW.CustomYearlyId IS NULL THEN BEGIN #init last_id to some value before using SET @last_id = 0; SET @yearly_id = 0; #INSERT INTO DEBUG VALUES (null,"start trigger"); set @count := (select count(*) from patients where YEAR(CreatedOn)=YEAR(curdate())); IF @count > 0 THEN BEGIN SET @last_id := (SELECT max(yearlyid) FROM patients WHERE YEAR(createdon)=YEAR(CURDATE())); SET @yearly_id = @last_id + 1; SET NEW.yearlyid := @yearly_id; #INSERT INTO DEBUG VALUES (null, concat("in if lastid is not null ",@yearly_id)); END; ELSE BEGIN #INSERT INTO DEBUG VALUES (null, concat("in else ",@yearly_id)); #SET @yearly_id = 1; SET NEW.yearlyid := 1; END; END IF; #Set NEW.yearlyid := 1; END; END IF; END;// delimiter ;