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

标签 mysql sql triggers mariadb mariasql

您好,这是我的 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;

我想在 tbl_ Patient 上放置 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));

CREATE TRIGGER ageTrigger
BEFORE INSERT ON tbl_pasien
FOR EACH ROW
SET NEW.age = YEAR(CURDATE()) - YEAR(birthDate);

但是我遇到了一些错误:

1235 - This version of MariaDB doesn't yet support 'multiple triggers with the same action time and event for one table'

如何在我的表上实现这 2 个触发器?

最佳答案

您可以使用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));

当发生多个并发插入时,这是一个糟糕的解决方案。

<小时/>

编辑

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

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

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

关于mysql - 如何在mysql上实现2个或多个触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34479803/

相关文章:

mysql - 让 MySQL AFTER INSERT 触发器在事务完成后触发

javascript - jQuery 触发器在 IE 中不起作用。为什么?

java - 每当有任何新行或任何新更新时从 Cassandra 数据库中提取?

c# - 数据源到 asp 日历

mysql - 我如何构建 libmySQL?

mysql - SQLSTATE[42S22] : Column not found: 1054 Unknown column 'id' in 'where clause' (SQL update. .) 其中 `id` 为空)

c# - Entity Framework 6 Code First 插入时的默认日期时间值

php - MySQL 错误 1064 : SQL syntax error in SELECT statement

mysql - SUBSTR 没有返回记录 (mysql)

sql - 无法将 csv 导入 SQLite 中的表 : no such table error