如何在mysql上实现2个或更多触发器

时间:2015-12-27 11:07:52

标签: mysql sql triggers mariadb mariasql

您好,这是sub-header的结构:

tbl_patient

我想在CREATE TABLE tbl_patient ( id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT, idPatient varchar(15) DEFAULT NULL, namePatient varchar(40) NOT NULL, age int NOT NULL, birthDate date, gender varchar(15) NOT NULL, status varchar(15) NOT NULL, address varchar(255) NOT NULL, work varchar(25) NOT NULL, phone varchar(15) NOT NULL ) ENGINE=InnoDb; 上添加2个触发器:

tbl_patient

但是我收到了一些错误:

  

1235 - 此版本的MariaDB尚不支持“多个触发器,其中一个表具有相同的操作时间和事件”

如何在桌面上实现2个触发器?

2 个答案:

答案 0 :(得分:1)

您可以改为使用computed columns

CREATE TABLE tbl_patient
(
    id int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
    idPatient varchar(15) AS (CONCAT("PAS-", id)),
    namePatient varchar(40) NOT NULL,
    age int AS (YEAR(CURDATE()) - YEAR(birthDate)),
    birthDate date,
    gender varchar(15) NOT NULL,
    status varchar(15) NOT NULL,
    address varchar(255) NOT NULL,
    work varchar(25) NOT NULL,
    phone varchar(15) NOT NULL
)
ENGINE=InnoDb;

说明:

1)请注意,您计算年龄的代码不正确,例如(2015-12-31和2016-01-01)。

计算年龄的更好方法:

SELECT YEAR(NOW()) - YEAR(birthDate) - 
       (DATE_FORMAT(birthDate, '%m%d') > DATE_FORMAT(NOW(), '%m%d')) AS age

2)

CREATE TRIGGER patientTrigger
BEFORE INSERT ON tbl_patient
FOR EACH ROW
SET NEW.idPatient = CONCAT("PAS-",COALESCE((SELECT MAX(id)+1 from tbl_patient),1));
当多个并发INSERT发生时,

是不好的解决方案。

修改

使用触发器,当用户更新birthDate时,您有更新年龄(是的,可能会发生)。

其他可能的解决方案是简单地创建视图。

CREATE VIEW vw_patient
AS 
SELECT `id`,  `namePatient`, `birthDate`,
       `gender`, `status`, `address`, `work`, `phone`,
  CONCAT("PAS-", id) AS `idPatient`,
  YEAR(NOW()) - YEAR(birthDate) - 
       (DATE_FORMAT(birthDate, '%m%d') > DATE_FORMAT(NOW(), '%m%d')) AS `age`
FROM `tbl_patient`

SqlFiddleDemo

答案 1 :(得分:0)

尝试将两个触发器的主体合并为单个触发器,如下所示:

CREATE TRIGGER patientTrigger BEFORE INSERT ON tbl_patient FOR EACH ROW 
BEGIN
    SET NEW.idPatient =  CONCAT("PAS-",COALESCE((SELECT MAX(id)+1 from tbl_patient),1)); 
    SET NEW.age = YEAR(CURDATE()) - YEAR(birthDate);
END