Модификация ON UPDATE RESTRICT триггера

189
23 декабря 2021, 04:50

Возникла необходимость модифицировать триггер, который обеспечивает целостность связи при операции UPDATE в родительской таблице. Движок - MyISAM.

Есть 2 таблицы: Developers (потомок) и Engines (родитель).

Таблица Developers:

CREATE TABLE `developers` (
`id_developer` int(10) unsigned NOT NULL AUTO_INCREMENT,
`fk_engine` int(10) unsigned NOT NULL,
`founding_date` date NOT NULL,
`earnings` float(6,2) NOT NULL,
`developer_name` varchar(45) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`description` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`location` varchar(45) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`email` varchar(45) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id_developer`),
KEY `fk_Developers_Engine_id_name` (`fk_engine`)
) ENGINE=MyISAM

Таблица Engines:

CREATE TABLE `engines` (
`id_engine` int(10) unsigned NOT NULL AUTO_INCREMENT,
`engine_name` varchar(45) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
`engine_description` text CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id_engine`)
) ENGINE=MyISAM 

Триггер:

DELIMITER $$
CREATE TRIGGER
gamestore_myisam.updateRestrict_myisam_engines
BEFORE UPDATE
ON gamestore_myisam.engines
FOR EACH ROW
BEGIN
IF (SELECT COUNT(*) FROM gamestore_myisam.developers WHERE fk_engine = old.id_engine)
!=0
THEN
signal sqlstate '45000' set message_text = 'Cannot update a child row:
foreign key constraint fails!';
END IF;
END $$
DELIMITER ;

Суть проблемы: данный триггер не позволяет обновить id_engine таблицы Engines, если этот id_engine содержится в fk_engine таблицы Developers так как в этом случае будет нарушена целосность связи. Но если мне необходимо обновить поле engine_name или engine_description этого id_engine в таблице Engines, то триггер не даст этого сделать.

Как модифицировать триггер чтобы он по прежнему не давал обновлять id_engine в таблице Engines, но при этом была возможность обновлять поля engine_name и engine_description этого id_engine?

READ ALSO
Получить список баз по имени таблицы

Получить список баз по имени таблицы

Необходимо получить список баз, в которых присутствует таблицы

194
как строку разбить на массив в запросе mysql (node.js)?

как строку разбить на массив в запросе mysql (node.js)?

Допустим есть строка с названиями, записанные через ","

163
Вызов внешней JS-функции в React-приложении

Вызов внешней JS-функции в React-приложении

Есть приложение на реакте, мне с бэкенда через ajax приходит сгенерированная там js функция для сторонней библиотекиПроблема в том, что эта...

190
Анализ временных рядов нейросетью

Анализ временных рядов нейросетью

Способна ли библиотека решить следующую задачу (вычислительную задачу)?

236