Не могу сделать мой триггер после работы вставки - PullRequest
0 голосов
/ 07 февраля 2019

Мне нужно обновить столбец в таблице после вставки значений.

Я сделал триггер, который после вставки делает это:

DELIMITER ;;

CREATE TRIGGER `work_ai` AFTER INSERT ON `work` FOR EACH ROW
BEGIN
UPDATE work w SET w.time_sum = new.time_sum WHERE w.id = new.id;
END;;

DELIMITER ;

Но я не могу заставить его работать .. и я нене знаю, что я делаю неправильно: /

Схема таблицы выглядит так:

DROP TABLE IF EXISTS `work`;
CREATE TABLE `work` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `admin_id` int(11) unsigned NOT NULL,
  `task_id` int(11) DEFAULT NULL,
  `client_id` int(11) DEFAULT NULL,
  `type` enum('job','break','lunch') NOT NULL DEFAULT 'job',
  `from` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `to` datetime DEFAULT NULL,
  `comment` varchar(255) DEFAULT NULL,
  `invoice` time DEFAULT NULL,
  `rate` int(11) NOT NULL DEFAULT '800',
  `locked` tinyint(1) DEFAULT '0',
  `time_sum` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `admin_id` (`admin_id`),
  KEY `task_id` (`task_id`),
  KEY `client_id` (`client_id`),
  CONSTRAINT `work_ibfk_1` FOREIGN KEY (`admin_id`) REFERENCES `admins` (`id`),
  CONSTRAINT `work_ibfk_2` FOREIGN KEY (`task_id`) REFERENCES `tasks` (`id`),
  CONSTRAINT `work_ibfk_3` FOREIGN KEY (`client_id`) REFERENCES `clients` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Пример данных: to = 2019-01-08 10:45:00 from = 2019-01-08 09:15:00, и результат будет 01: 30: 00

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Я решил это.

BEGIN
    IF (NEW.to) THEN
       SET NEW.diff = TIMEDIFF(NEW.to,NEW.from);
    END IF;
END
0 голосов
/ 07 февраля 2019

Таким образом, поскольку id является первичным ключом, то, чего вы хотите достичь - после вставки строки в работу таблицы, вы хотите обновить значение time_sum существующей строки с тем же первичным ключом в той же таблице с помощью time_sumзначение из только что вставленной строки ???

Это то, что ясно говорит оператор UPDATE в вашем триггере, но он просто не вычисляется.В лучшем случае это просто бессмысленный беспроигрышный вариант.

Поэтому, пожалуйста, дайте ему вторую попытку объяснить, что вам нужно / нужно.

...