Срабатывание BEFORE INSERT триггера при запросе INSERT...SELECT

160
26 января 2022, 03:40

Есть триггер для проверки уникальности вставляемого поля login в таблицу Client.

Таблица Client:

CREATE TABLE IF NOT EXISTS `Store_InnoDB`.`Client`
(
`id_client` INT UNSIGNED NOT NULL AUTO_INCREMENT,
`fk_role` INT UNSIGNED NOT NULL DEFAULT 0,
`fk_gender` INT UNSIGNED NOT NULL DEFAULT 0,
`last_name` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL,
`first_name` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL,
`middle_name` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL,
`birthday` DATE NOT NULL,
`contact_phone` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL,
`city` TEXT CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL,
`login` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL,
`password` VARCHAR(45) CHARACTER SET 'utf8' COLLATE 'utf8_unicode_ci' NOT NULL,
PRIMARY KEY (`id_client`),
INDEX `fk_User_Roles_id_name` (`fk_role` ASC),
INDEX `fk_User_Gender_id_name` (`fk_gender` ASC),
CONSTRAINT `fk_Client_Roles_name` FOREIGN KEY (`fk_role`)
REFERENCES `Store_InnoDB`.`Roles` (`id_role`)
ON DELETE RESTRICT ON UPDATE RESTRICT,
CONSTRAINT `fk_Client_Gender_name` FOREIGN KEY (`fk_gender`)
REFERENCES `Store_InnoDB`.`Gender` (`id_gender`)
ON DELETE RESTRICT ON UPDATE RESTRICT
)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_unicode_ci;

Триггер:

   DELIMITER $$
CREATE TRIGGER store_innodb.clientReg
BEFORE INSERT
ON store_innodb.client
FOR EACH ROW
BEGIN
SET NEW.password = md5(new.password);
IF (select distinct login from store_innodb.client where login =
new.login) IS NOT NULL
THEN
signal sqlstate '45000' set message_text = 'Клиент с таким логином уже
зарегистрирован в системе!';
END IF;
END $$
DELIMITER ;

Проблема: При добавлении новой записи в таблицу запросом вида:

insert into store_innodb.client (fk_role, fk_gender, last_name, first_name, middle_name, birthday, contact_phone, city, login, password) values ('value1', 'value2', 'value3', 'value4', 'value5', 'value6', 'value7', 'value8', 'value9', 'value10');

Триггер срабатывает, проверяет логин на уникальность и вставляет запись, но если использовать вставку с INSERT...SELECT:

insert into store_innodb.client (fk_role, fk_gender, last_name,
first_name, middle_name, birthday, contact_phone, city, login, password)
select r.id_role, g.id_gender, 'Иванов', 'Иван', 'Иванович',
STR_TO_DATE('23.11.1976', '%d.%m.%Y'), '+380486582839', 'Тест',
'тестлогин', 'иванов1976'
from store_innodb.client s, store_innodb.roles r,
store_innodb.gender g where g.gender = 'М'
and r.role_name = 'user';

Триггер срабатывает и выдает сообщение:

Error Code: 1644. Клиент с таким логином уже зарегистрирован в системе!

Я так понимаю, что когда я использую запрос select в вставке данных, где передается в том числе и login и при этом в самом теле триггера тоже есть select на проверку уникальности login - триггер срабатывает и выдает сообщение, что логин уже занят, хотя в самой таблице разумеется этого логина нет. Каким образом нужно изменить триггер чтобы он смог работать с запросом INSERT...SELECT?

READ ALSO
Написать запрос к СУБД MySQL

Написать запрос к СУБД MySQL

Доброго времени суток уважаемые форумчане! В программировании MySQL совсем новичокНужно написать SQL-запрос к СУБД MySQL, который выбрал из базы...

132
Как из таблицы БД извлечь последнюю добавленную запись?

Как из таблицы БД извлечь последнюю добавленную запись?

Можно ли это сделать с помощью LIMIT? Или можно ли извлечь запись у которой самый большой id, так как у каждой строки он автоинкемируемый, а значит...

111
Как лучше хранить данные

Как лучше хранить данные

Приветствую всех и поздравляю с наступающим Новым годом)

151
Prompt при изменении innerHTML-a выдает undefined

Prompt при изменении innerHTML-a выдает undefined

Всем добра и мира! Знаете в чем может быть ошибка? Функция editPrompt при вызывании выдает undefined

232