Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / MySQL Новый топик    Ответить
 Триггер MySQL  [new]
polygraph
Member

Откуда:
Сообщений: 7
Есть триггер, который при обновлении запрещает использовать одинаковые имена в таблице.

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

DELIMITER $$
CREATE TRIGGER DuplicateGameName_update
BEFORE INSERT ON game
FOR EACH ROW
BEGIN
  IF (EXISTS(SELECT 1 FROM game WHERE name = NEW.name)) THEN
    SIGNAL SQLSTATE VALUE '45000' SET MESSAGE_TEXT = ' Такая игра уже имеется в базе!';
  END IF;
END$$
DELIMITER ;


скрин : https://prnt.sc/1334u4q

таблица имеет вид
id_game |name|path|price|system_param|description|year_made||developer|size_game
18 май 21, 22:28    [22323854]     Ответить | Цитировать Сообщить модератору
 Re: Триггер MySQL  [new]
miksoft
Member

Откуда:
Сообщений: 38828
polygraph
BEFORE INSERT
Триггер на INSERT, а на картинке UPDATE. Что-то тут не так...
18 май 21, 22:42    [22323857]     Ответить | Цитировать Сообщить модератору
 Re: Триггер MySQL  [new]
polygraph
Member

Откуда:
Сообщений: 7
Извиняюсь, я не так написал, там вот так

 DELIMITER $$
CREATE TRIGGER DuplicateGameName_update
BEFORE UPDATE ON game
FOR EACH ROW
BEGIN
  IF (EXISTS(SELECT 1 FROM game WHERE name = NEW.name)) THEN
    SIGNAL SQLSTATE VALUE '45000' SET MESSAGE_TEXT = ' Такая игра уже имеется в базе!';
  END IF;
END$$
DELIMITER ;
18 май 21, 22:54    [22323860]     Ответить | Цитировать Сообщить модератору
 Re: Триггер MySQL  [new]
polygraph
Member

Откуда:
Сообщений: 7
Триггер срабатывает если я хочу изменить у поля не имя, а другое поле (на имя тоже срабатывает)

Сообщение было отредактировано: 18 май 21, 22:48
18 май 21, 22:55    [22323862]     Ответить | Цитировать Сообщить модератору
 Re: Триггер MySQL  [new]
miksoft
Member

Откуда:
Сообщений: 38828
polygraph,

Триггер срабатывает на всю запись, а не на поле.
Запись в таблице уже есть, поэтому EXISTS(SELECT 1 FROM game WHERE name = NEW.name) не пройдет, он среагирует на текущую запись.
В триггере на UPDATE надо проверять записи, не совпадающие с изменяемой записью по первичному ключу.
Если, допустим, первичный ключ - это поле id, то как-то так:
DELIMITER $$
CREATE TRIGGER DuplicateGameName_update
BEFORE UPDATE ON game
FOR EACH ROW
BEGIN
  IF (EXISTS(SELECT 1 FROM game WHERE name = NEW.name AND id <> NEW.id)) THEN
    SIGNAL SQLSTATE VALUE '45000' SET MESSAGE_TEXT = ' Такая игра уже имеется в базе!';
  END IF;
END$$
DELIMITER ;


Хотя, замечу, странная идея контролировать уникальность триггерами. Для этого есть Unique Indexes
18 май 21, 23:08    [22323868]     Ответить | Цитировать Сообщить модератору
 Re: Триггер MySQL  [new]
polygraph
Member

Откуда:
Сообщений: 7
Спасибо !!
19 май 21, 00:03    [22323881]     Ответить | Цитировать Сообщить модератору
 Re: Триггер MySQL  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34697
polygraph
Извиняюсь, я не так написал, там вот так

 DELIMITER $$
CREATE TRIGGER DuplicateGameName_update
BEFORE UPDATE ON game
FOR EACH ROW
BEGIN
  IF (EXISTS(SELECT 1 FROM game WHERE name = NEW.name)) THEN
    SIGNAL SQLSTATE VALUE '45000' SET MESSAGE_TEXT = ' Такая игра уже имеется в базе!';
  END IF;
END$$
DELIMITER ;



Не проще ли не мучиться, а создать уникальный индекс?
Такой триггер всё равно не рабочий.
19 май 21, 17:25    [22324328]     Ответить | Цитировать Сообщить модератору
 Re: Триггер MySQL  [new]
Alex_Ustinov
Member

Откуда: Nickel
Сообщений: 3799
MasterZiv,

>Такой триггер всё равно не рабочий.

Почему?
19 май 21, 23:47    [22324528]     Ответить | Цитировать Сообщить модератору
 Re: Триггер MySQL  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21181
Alex_Ustinov
Почему?
Потому что ему было лень опустить глаза и найти поправленный вариант, с условием AND id <> NEW.id
20 май 21, 08:15    [22324581]     Ответить | Цитировать Сообщить модератору
 Re: Триггер MySQL  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 53424
Akina
поправленный вариант

Даже поправленный вариант будет работать только на MyISAM, где транзакций нет в принципе, а любое чтение - грязное.
20 май 21, 13:40    [22324724]     Ответить | Цитировать Сообщить модератору
 Re: Триггер MySQL  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21181
Dimitry Sibiryakov
Даже поправленный вариант будет работать только на MyISAM, где транзакций нет в принципе, а любое чтение - грязное.

А вот fiddle упорно утверждает, что это не так.
20 май 21, 14:23    [22324748]     Ответить | Цитировать Сообщить модератору
 Re: Триггер MySQL  [new]
miksoft
Member

Откуда:
Сообщений: 38828
Да, строго говоря, в InnoDB триггер можно обмануть при одновременной модификации данных в разных сессиях.
20 май 21, 22:13    [22325006]     Ответить | Цитировать Сообщить модератору
Все форумы / MySQL Ответить