更新后触发器不工作,不知道如何设置合适的条件

8mmmxcuj  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(343)

我想创造一个 trigger 我的医院数据库。这是一个简单的项目,所以 assumption 如果一个病人被检查出医院,他就完全治愈了。所以 trigger 必须从中删除记录
patient_diseases (it contains id, patient_id, disease_id) 当一个 check_out_date 中的列
visit (visit contains id, check_in_date, check_out_date and patient_id) 表从空更改为实际日期。

USE hospital;

    DROP TRIGGER IF EXISTS cure_patient;
    DELIMITER //
    CREATE TRIGGER cure_patient
    AFTER UPDATE ON visit
    FOR EACH ROW
        BEGIN
        IF NEW.check_out_date != NULL THEN
             DELETE from patient_disease WHERE ???
        END IF;
        END;
    //
    DELIMITER ;

到目前为止,我想出了这个,我只是不知道我应该写什么,使脚本采取 patient_id 从更改日期的就诊中删除具有相同日期的记录 patient_id 从另一张table。

visit | CREATE TABLE `visit` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `check_in_date` date DEFAULT NULL,
      `check_out_date` date DEFAULT NULL,
      `patient_id` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `patient_id2` (`patient_id`),
      CONSTRAINT `patient_id2` FOREIGN KEY (`patient_id`) REFERENCES 'patient` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
    ) ENGINE=InnoDB AUTO_INCREMENT=31 DEFAULT CHARSET=utf8 |

    | p_d  | CREATE TABLE `p_d` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `patient_id` int(11) DEFAULT NULL,
      `disease_id` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
      KEY `patient_id_idx` (`patient_id`),
      KEY `disease_id_idx` (`disease_id`),
      CONSTRAINT `disease_id` FOREIGN KEY (`disease_id`) REFERENCES `choroba` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
      CONSTRAINT `patient_id` FOREIGN KEY (`patient_id`) REFERENCES `patient` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
    ) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 |
vtwuwzda

vtwuwzda1#

触发器主体应为:

BEGIN
    IF NEW.check_out_date IS NOT NULL THEN
         DELETE p_d FROM p_d WHERE p_d.patient_id = new.patient_id;
    END IF;
END

请注意 NEW.check_out_date != NULL 永远不会 TRUE 因为任何与 NULL (除 <=> )总会回来的 NULL . 所以你需要使用 IS NOT NULL 相反。
这个触发器也可以用一条语句来编写(在这种情况下,您不需要使用 BEGIN 以及 END 并更改分隔符):

CREATE TRIGGER cure_patient
    AFTER UPDATE ON visit
    FOR EACH ROW
        DELETE p_d FROM p_d
        WHERE NEW.check_out_date IS NOT NULL
          AND p_d.patient_id = new.patient_id;

相关问题