Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mysql在更新时触发,保持列高于其他列_Mysql_Triggers - Fatal编程技术网

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

mysql在更新时触发,保持列高于其他列,mysql,triggers,Mysql,Triggers,我正在尝试创建一个mySql触发器 表program_user如下所示: 用户|程序| id |周|最长|周|处于活动状态| 我的目标是保持max_week的整数始终等于或高于week 因为用户可以重置周,所以我需要保持他的最佳进度 行已创建,并以3种不同方式更新: 按服务器(+1到实际周) 由用户重置(周=1) 由管理员设置 我在更新后尝试了多个代码来更新行本身,但它们似乎都不起作用。谷歌似乎没有发现任何类似的案例,也没有发现stackOverflow:( 然后更新: UPDATE `pr

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

表program_user如下所示:

用户|程序| id |周|最长|周|处于活动状态|

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

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

  • 按服务器(+1到实际周)
  • 由用户重置(
    =1)
  • 由管理员设置
我在更新后尝试了多个代码来更新行本身,但它们似乎都不起作用。谷歌似乎没有发现任何类似的案例,也没有发现stackOverflow:(

然后更新:

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

结果:保存触发器时没有错误,更新任何week列时也没有错误,但是,列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)

看起来它应该可以工作,你有没有没有没有这样的示例?保存触发器时没有错误,更新任何week列时也没有错误,但是,列max_week保持其初始状态对我来说很好。你有没有这样的示例?因为SQL是一种声明性语言。。定义所需内容,而不是定义所需方式,这意味着表结构/约束或相关数据可能会更改SQL语句的执行/含义。我唯一需要注意的是,如果您想涵盖记录创建,在插入之前也需要启用触发器。谢谢帮助,我重新启动了服务器服务,现在一切正常。。。我不知道那里发生了什么,现在也很好。。。只是在这里浪费了我和你的时间:/
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)