mysql 更新时触发,保持列高于其他列

标签 mysql triggers

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

表program_user看起来像这样:

用户 ID |节目 ID |周 |最大周 | is_active |

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

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

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

我在更新后尝试了多个代码来更新行本身,但它们似乎都不起作用。 Google 似乎没有找到任何类似的案例,也没有 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 保持其初始状态。

谢谢:)

最佳答案

我看不到您的问题,您的触发器按照所提供的信息按预期工作。

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)

关于mysql 更新时触发,保持列高于其他列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58258354/

相关文章:

mysql - 使用列名的动态行数据重建表的 SQL 查询

mysql - MySQL 对一列进行多次求和

mysql - 创建一个 MySQL 触发器来验证另一个表上的数据

mysql - 通过触发器应用表的列权限

mysql - 如何在mysql触发器中将点(.)连接到像pic.jpeg这样的字符串?

php - 如何使用单个 MySQL 查询更新表中的多条记录?

sql - SQL 存储过程中的 "referencing old"和 "referencing new"有什么区别?

sql - Postgres 触发器干扰 'on conflict do update set'

postgresql - 为什么我的 Postgres DELETE 删除零行,当存在一个行时?

mysql - (MySQL) 带 2 个相同外键的主键