【问题标题】:mysql trigger on update, keep column higher than othermysql 在更新时触发,保持列高于其他列
【发布时间】:2019-10-06 14:44:11
【问题描述】:

我正在尝试创建一个 mySql 触发器。

表 program_user 如下所示:

user_id |程序 ID |周 |最大周 | is_active |

我的目标是保持来自max_week 的整数始终等于或高于week 因为week可以被用户重置,所以我需要保持他的最佳进度。

行已创建并以 3 种不同方式更新:

  • 由服务器(实际周+1)
  • 由用户重置 (week =1)
  • 由管理员设置

我在更新后尝试了多个代码来更新行本身,但它们似乎都不起作用。谷歌似乎没有找到任何类似的案例,也没有 stackOverflow :(

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";

CREATE TABLE `program_user` (
  `user_id` int(11) NOT NULL,
  `prog_id` int(11) NOT NULL,
  `week` int(11) DEFAULT NULL,
  `max_week` int(11) NOT NULL DEFAULT '1',
  `active` tinyint(4) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `program_user` (`user_id`, `prog_id`, `week`, `max_week`, `active`) VALUES
(6967, 1, 2, 2, 1),
(6967, 2, 2, 4, 0),
(6967, 3, 1, 1, 0),
(6967, 4, 1, 1, 0),
(6967, 5, 1, 1, 0),
(6968, 1, 1, 1, 1),
(6968, 2, 1, 1, 0),
(6968, 3, 1, 1, 0),
(6968, 4, 1, 1, 0),
(6968, 5, 1, 1, 0);

DELIMITER $$
CREATE TRIGGER `trigg_max_week1` BEFORE UPDATE ON `program_user` FOR EACH ROW BEGIN
       IF new.week >= old.max_week THEN
          SET new.max_week = new.week;
       END IF;
    END
$$
DELIMITER ;

ALTER TABLE `program_user`
  ADD UNIQUE KEY `user_idpk` (`user_id`,`prog_id`);


COMMIT;

然后更新:

UPDATE `program_user` SET `week` = '5' WHERE `program_user`.`user_id` = 6967 AND `program_user`.`prog_id` = 2;

结果:保存触发器时没有错误,更新任何周列时也没有错误,但是,max_week 列在更新后保持其初始状态。

谢谢你:)

【问题讨论】:

  • 看起来它应该可以工作,你有没有例子吗?
  • 保存触发器时没有错误,更新任何周列时也没有错误,但是,列 max_week 保持其初始状态
  • 对我来说很好,你有没有例子吗?
  • 请参阅Why should I provide a Minimal Reproducible Example for a very simple SQL query?,因为 SQL 是一种声明性语言。在您定义所需内容而不是您想要的方式的地方,这意味着表结构/约束或数据可以改变执行/ SQL语句的含义..
  • 我唯一能注意到的是,如果您想覆盖记录创建,您还需要在插入之前触发触发器。

标签: mysql triggers


【解决方案1】:

我看不到您的问题,您的触发器使用提供的信息按预期工作..

drop table if exists program_user;
CREATE TABLE `program_user` (
  `user_id` int(11) NOT NULL,
  `prog_id` int(11) NOT NULL,
  `week` int(11) DEFAULT NULL,
  `max_week` int(11) NOT NULL DEFAULT '1',
  `active` tinyint(4) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `program_user` (`user_id`, `prog_id`, `week`, `max_week`, `active`) VALUES
(6967, 1, 2, 2, 1),
(6967, 2, 2, 4, 0),
(6967, 3, 1, 1, 0),
(6967, 4, 1, 1, 0),
(6967, 5, 1, 1, 0),
(6968, 1, 1, 1, 1),
(6968, 2, 1, 1, 0),
(6968, 3, 1, 1, 0),
(6968, 4, 1, 1, 0),
(6968, 5, 1, 1, 0);

DELIMITER $$
CREATE TRIGGER `trigg_max_week1` BEFORE UPDATE ON `program_user` FOR EACH ROW 
BEGIN
       IF new.week >= old.max_week THEN
          SET new.max_week = new.week;
       END IF;
END $$
DELIMITER ;

ALTER TABLE `program_user`
  ADD UNIQUE KEY `user_idpk` (`user_id`,`prog_id`),
  ADD KEY `const_seance_id_seance` (`prog_id`);


UPDATE `program_user` 
    SET `week` = '5' 
WHERE `program_user`.`user_id` = 6967 AND `program_user`.`prog_id` = 2;

select * from program_user WHERE `program_user`.`user_id` = 6967 AND `program_user`.`prog_id` = 2;

+---------+---------+------+----------+--------+
| user_id | prog_id | week | max_week | active |
+---------+---------+------+----------+--------+
|    6967 |       2 |    5 |        5 |      0 |
+---------+---------+------+----------+--------+
1 row in set (0.00 sec)

【讨论】:

  • 感谢您的帮助,我重新启动了服务器服务,现在一切正常...我不知道那里发生了什么,现在也可以正常工作...只是在这里浪费了我和您的时间:/
猜你喜欢
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
  • 2019-01-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多