MySQL триггер при обновлении, держать столбец выше, чем другие - PullRequest
0 голосов
/ 06 октября 2019

Я пытаюсь создать триггер mySql.

Таблица program_user выглядит следующим образом:

user_id |ID_программы |неделя |max_week |is_active |

Моя цель - поддерживать целое число от max_week всегда равным или превышающим week. Поскольку week может быть сброшен пользователем, мне нужно сохранить его лучший прогресс.

Строки уже созданы и обновляются тремя различными способами:

  • сервером (+1 к фактической неделе)
  • , сброшенный пользователем (week =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 остается в своем исходном состоянии.

Спасибо:)

1 Ответ

0 голосов
/ 06 октября 2019

Я не вижу вашей проблемы, ваш триггер работает, как и ожидалось, с предоставленной информацией ..

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...