powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Триггер MySQL
12 сообщений из 12, страница 1 из 1
Триггер MySQL
    #40071172
polygraph
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть триггер, который при обновлении запрещает использовать одинаковые имена в таблице.

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

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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
...
Рейтинг: 0 / 0
Триггер MySQL
    #40071174
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polygraph
Код: sql
1.
BEFORE INSERT

Триггер на INSERT, а на картинке UPDATE. Что-то тут не так...
...
Рейтинг: 0 / 0
Триггер MySQL
    #40071176
polygraph
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Извиняюсь, я не так написал, там вот так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 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 ;
...
Рейтинг: 0 / 0
Триггер MySQL
    #40071178
polygraph
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Триггер срабатывает если я хочу изменить у поля не имя, а другое поле (на имя тоже срабатывает)
...
Рейтинг: 0 / 0
Триггер MySQL
    #40071181
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polygraph,

Триггер срабатывает на всю запись, а не на поле.
Запись в таблице уже есть, поэтому EXISTS(SELECT 1 FROM game WHERE name = NEW.name) не пройдет, он среагирует на текущую запись.
В триггере на UPDATE надо проверять записи, не совпадающие с изменяемой записью по первичному ключу.
Если, допустим, первичный ключ - это поле id, то как-то так:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
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
...
Рейтинг: 0 / 0
Триггер MySQL
    #40071192
polygraph
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо !!
...
Рейтинг: 0 / 0
Триггер MySQL
    #40071429
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
polygraph
Извиняюсь, я не так написал, там вот так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
 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 ;




Не проще ли не мучиться, а создать уникальный индекс?
Такой триггер всё равно не рабочий.
...
Рейтинг: 0 / 0
Триггер MySQL
    #40071528
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

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

Почему?
...
Рейтинг: 0 / 0
Триггер MySQL
    #40071556
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alex_Ustinov
Почему?
Потому что ему было лень опустить глаза и найти поправленный вариант, с условием AND id <> NEW.id
...
Рейтинг: 0 / 0
Триггер MySQL
    #40071654
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Akina
поправленный вариант

Даже поправленный вариант будет работать только на MyISAM, где транзакций нет в принципе, а любое чтение - грязное.
...
Рейтинг: 0 / 0
Триггер MySQL
    #40071666
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov
Даже поправленный вариант будет работать только на MyISAM, где транзакций нет в принципе, а любое чтение - грязное.

А вот fiddle упорно утверждает, что это не так.
...
Рейтинг: 0 / 0
Триггер MySQL
    #40071784
miksoft
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, строго говоря, в InnoDB триггер можно обмануть при одновременной модификации данных в разных сессиях.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Триггер MySQL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]