У меня есть дело с каким-то наследством:
устройство -> raut_controller -> raut_flat_tempera_control_controller
Я создал триггеры для вставки родительских строк, чтобы я мог иметь их идентификаторы перед вставкой в унаследованные таблицы. Перед вставкой в «raut_controller» триггер вставляет строку в таблицу device
, получает идентификатор с помощью LAST_INSERT_ID () и изменяет NEW.id. То же самое с raut_flat_temperature_control_controller
. Поэтому вставка в raut_flat_tempera__control_controller должна вызывать измененную вставку в 3 таблицах.
Проблема в том, что я не могу вставить в таблицу raut_flat_temperature_control_controller
из-за сбоя ограничения внешнего ключа. После всех триггеров он пытается вставить в "raut_flat_tempera__control_controller" с id = 1. которого нет в родительской таблице "raut_controller". В то время как триггер в raut_controller
успешно вставляет строку в таблицу device
.
Почему LAST_INSERT_ID () не работает в триггере, если raut_flat_temperature_control_controller
?
UPD. Есть ли способ игнорировать BEFORE INSERT TRIGGER
в MySQL
Мои таблицы:
CREATE TABLE `device` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`device_type_id` int(11) NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_device_type_id` (`device_type_id`),
CONSTRAINT `fk_device_type_id` FOREIGN KEY (`device_type_id`) REFERENCES `device_type` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
);
CREATE TABLE `raut_controller` (
`id` int(11) NOT NULL,
`raut_controller_type_id` int(11) NOT NULL,
`ip_adress` int(10) unsigned NOT NULL DEFAULT '0',
`mac_address` bigint(20) unsigned NOT NULL DEFAULT '0',
`serial_num` bigint(20) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
KEY `fk_raut_controller_type_id_idx` (`raut_controller_type_id`),
CONSTRAINT `fk_raut_controller_device` FOREIGN KEY (`id`) REFERENCES `device` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT `fk_raut_controller_type_id` FOREIGN KEY (`raut_controller_type_id`) REFERENCES `raut_controller_type` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
);
CREATE TABLE `raut_flat_temperature_control_controller` (
`id` int(11) NOT NULL,
`version` int(11) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
CONSTRAINT `fk_raut_flat_temperature_control` FOREIGN KEY (`id`) REFERENCES `raut_controller` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
);
и 2 справочных таблицы для получения * type_id:
CREATE TABLE `device_type` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`table_name` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `unq_device_type_name` (`name`),
UNIQUE KEY `unq_device_type_table_name` (`table_name`),
KEY `idx_device_type_name` (`name`),
KEY `idx_device_type_table_name` (`table_name`)
);
CREATE TABLE `raut_controller_type` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
`table_name` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `unq_raut_controller_type_name` (`name`),
UNIQUE KEY `unq_raut_controller_type_table_name` (`table_name`),
KEY `idx_raut_controller_type_name` (`name`),
KEY `id_raut_controller_type_table_name` (`table_name`)
);
Триггеры
CREATE TRIGGER `raut_controller_device_id` BEFORE INSERT ON `raut_controller` FOR EACH ROW
BEGIN
INSERT INTO `reeve`.`device` (
`device_type_id`
)
VALUES (
(SELECT `id` FROM `reeve`.`device_type` WHERE table_name = 'raut_controller')
);
SET NEW.id = LAST_INSERT_ID();
END
CREATE TRIGGER `raut_flat_temperature_control_controller_id` BEFORE INSERT ON `raut_flat_temperature_control_controller` FOR EACH ROW
BEGIN
INSERT INTO `reeve`.`raut_controller` (
`raut_controller_type_id`
)
VALUES (
(SELECT `id` FROM `reeve`.`raut_controller_type` WHERE table_name = 'raut_flat_temperature_control_controller')
);
SET NEW.id = LAST_INSERT_ID();
END