Триггер mysql: после вставки +1 в зависимости от того, что введено? - PullRequest
1 голос
/ 23 января 2020

CREATE TABLE `inventory` (
  `id` int(11) NOT NULL,
  `owner` int(11) DEFAULT NULL,
  `grade1` int(11) DEFAULT NULL,
  `grade2` int(11) NOT NULL,
  `grade3` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `inventory`
--

INSERT INTO `inventory` (`id`, `owner`, `grade1`, `grade2`, `grade3`) VALUES
(3, 1, 2, 1, 1);

-- --------------------------------------------------------

--
-- Table structure for table `transfer`
--

CREATE TABLE `transfer` (
  `id` int(11) NOT NULL,
  `owner` int(11) DEFAULT NULL,
  `total` char(11) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Dumping data for table `transfer`
--

INSERT INTO `transfer` (`id`, `owner`, `total`) VALUES
(20, 1, 1);

--
-- Triggers `transfer`
--
DELIMITER $$
CREATE TRIGGER `t` AFTER INSERT ON `transfer` FOR EACH ROW update inventory t1
set t1.grade1 = t1.grade1 + 1
WHERE t1.owner = new.owner
AND `total` = '/1'
$$
DELIMITER ;

У меня есть две таблицы, как вы можете видеть из приведенного выше кода. Я нахожусь в процессе использования триггеров в MySQL.

То, что я пытаюсь сделать, это то, что, когда кто-то вводит что-то в передачу, и владелец сопоставляет владельца, который находится в инвентаре, - если то, что они ввели «(число) / 1» в общее количество в перевод, это добавило бы 1 к 1 классу. Если они набрали '(число) / 2' всего, это добавит 1 к 2-му классу. И то же самое для 3 класса. Как видно из приведенного выше триггера, это то, что я пробовал. Я пробовал без AND `total` = '/1', поэтому я знаю, что проблема должна быть в этой части. Я также пробовал без `приблизительно итогового значения, однако он не распознает этот столбец без него.

Я просмотрел SO и не могу найти ничего, чтобы решить эту проблему.

I нужен этот раздел через триггер - если у кого-то есть идеи, пожалуйста, дайте мне знать. Спасибо

Ответы [ 2 ]

1 голос
/ 23 января 2020

Обычный способ условно обновить разные столбцы - обновить все из них, но использовать условие, чтобы определить, присвоить ли им новое значение или сохранить старое значение. Это можно использовать в триггере, как и любой другой запрос UPDATE.

CREATE TRIGGER `t` AFTER INSERT ON `transfer` FOR EACH ROW update inventory t1
set t1.grade1 = IF(new.total LIKE '%/1', t1.grade1 + 1, t1.grade1),
    t1.grade2 = IF(new.total LIKE '%/2', t1.grade2 + 1, t1.grade2),
    t1.grade3 = IF(new.total LIKE '%/3', t1.grade3 + 1, t1.grade3)
WHERE t1.owner = new.owner
0 голосов
/ 23 января 2020

Похоже, что вам действительно нужен четвертый столбец grade в таблице transfer, чтобы ваш код триггера мог знать, какую оценку увеличить. Все, что у вас есть в триггере, это OLD.* и NEW.*, столбцы строки, которые изменились. Вы не можете сделать так, чтобы один из ваших текущих целочисленных столбцов содержал дополнительную информацию, которая больше, чем простое целое число.

ALTER TABLE transfer ADD COLUMN grade TINYINT UNSIGNED;

Затем вы можете использовать это в триггере, чтобы указать, какую оценку увеличивать.

CREATE TRIGGER `t` AFTER INSERT ON `transfer` FOR EACH ROW 
UPDATE inventory
SET grade1 = grade1 + CASE NEW.grade WHEN 1 THEN 1 ELSE 0 END,
    grade2 = grade2 + CASE NEW.grade WHEN 2 THEN 1 ELSE 0 END,
    grade3 = grade3 + CASE NEW.grade WHEN 3 THEN 1 ELSE 0 END;
WHERE owner = NEW.owner
...