mysql触发器-更新值,值=行数

标签 mysql triggers

当更新、插入或插入名为 leave 的表时,我想运行 mysql 触发器来更新表 leave_taken col num 的值已删除。

就像我插入此行来离开:

INSERT INTO `leave` (`id_leave`, `staff_leave_application_id_staff_leave_application`, `staff_leave_application_staff_id_staff`, `leave_type_id_leave_type`, `date`, `active`, `date_updated`) VALUES
(7, 7, 6, 7, '2013-01-21', 1, '2013-01-18'),
(8, 7, 6, 7, '2013-01-22', 1, '2013-01-18'),
(9, 7, 6, 7, '2013-01-23', 1, '2013-01-18'),
(10, 7, 6, 7, '2013-01-24', 1, '2013-01-18'),
(11, 7, 6, 7, '2013-01-25', 2, '2013-01-18');

然后表 leave_taken col num 值更新为 5 其中:

staff_leave_application_staff_id_staff = currently updated staff_leave_application_staff_id_staff,
and
leave_type_id_leave_type = currently updated leave_type_id_leave_type

我已包含下表。

请假

CREATE TABLE IF NOT EXISTS `leave` (
  `id_leave` int(11) NOT NULL AUTO_INCREMENT,
  `staff_leave_application_id_staff_leave_application` int(11) NOT NULL,
  `staff_leave_application_staff_id_staff` int(11) NOT NULL,
  `leave_type_id_leave_type` int(11) NOT NULL,
  `date` date NOT NULL,
  `active` int(11) NOT NULL DEFAULT '1',
  `date_updated` date NOT NULL,
  PRIMARY KEY (`id_leave`,`staff_leave_application_id_staff_leave_application`,`staff_leave_application_staff_id_staff`),
  KEY `fk_table1_leave_type1` (`leave_type_id_leave_type`),
  KEY `fk_table1_staff_leave_application1` (`staff_leave_application_id_staff_leave_application`,`staff_leave_application_staff_id_staff`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ;

请假:

CREATE TABLE IF NOT EXISTS `leave_balance` (
  `id_leave_balance` int(11) NOT NULL AUTO_INCREMENT,
  `staff_id_staff` int(11) NOT NULL,
  `leave_type_id_leave_type` int(11) NOT NULL,
  `balance` int(3) NOT NULL,
  `date_added` date NOT NULL,
  PRIMARY KEY (`id_leave_balance`),
  UNIQUE KEY `id_leave_balance_UNIQUE` (`id_leave_balance`),
  KEY `fk_leave_balance_staff1` (`staff_id_staff`),
  KEY `fk_leave_balance_leave_type1` (`leave_type_id_leave_type`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

最佳答案

首先,在 leave 表中的标识列上定义一个唯一键:

ALTER TABLE leave
  ADD UNIQUE (staff_leave_application_staff_id_staff, leave_type_id_leave_type);

然后继续定义您的触发器:

CREATE TRIGGER my_insert_trigger AFTER INSERT ON leave FOR EACH ROW
  INSERT INTO leave_taken
    (staff_leave_application_staff_id_staff, leave_type_id_leave_type, num)
  VALUES
    (NEW.staff_leave_application_staff_id_staff, NEW.leave_type_id_leave_type, 1)
  ON DUPLICATE KEY UPDATE
    num = num + 1;

CREATE TRIGGER my_delete_trigger AFTER DELETE ON leave FOR EACH ROW
  UPDATE leave_taken
  SET    num = num - 1
  WHERE  staff_leave_application_staff_id_staff = OLD.staff_leave_application_staff_id_staff
     AND leave_type_id_leave_type = OLD.leave_type_id_leave_type;

DELIMITER ;;

CREATE TRIGGER my_update_trigger AFTER UPDATE ON leave FOR EACH ROW
  IF NOT (
      NEW.staff_leave_application_staff_id_staff <=> OLD.staff_leave_application_staff_id_staff
  AND NEW.leave_type_id_leave_type <=> OLD.leave_type_id_leave_type
  ) THEN
    UPDATE leave_taken
    SET    num = num - 1
    WHERE  staff_leave_application_staff_id_staff = OLD.staff_leave_application_staff_id_staff
       AND leave_type_id_leave_type = OLD.leave_type_id_leave_type;
    INSERT INTO leave_taken
      (staff_leave_application_staff_id_staff, leave_type_id_leave_type, num)
    VALUES
      (NEW.staff_leave_application_staff_id_staff, NEW.leave_type_id_leave_type, 1)
    ON DUPLICATE KEY UPDATE
      num = num + 1;
  END IF;;

DELIMITER ;

关于mysql触发器-更新值,值=行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14411411/

相关文章:

triggers - 单击特定顺序后触发事件

java - Java GUI 项目中的 View 、触发器和存储过程有什么用处吗?

mysql - 如何在不使用限制的情况下在MySql中找到前5名薪水

php - 从 PHP 代码创建触发器时出现语法错误

MYSQL:Where子句不明确

MySQL的character_set_server不会生效

Oracle PL/SQL : a scheduled procedure, 导致触发触发器?

triggers - 在 db2 中启用和禁用触发器

mysql - 热 vs 冷 mysql 模式迁移和提高速度

mysql - 设计一个mysql工作流数据库