LAST_INSERT_ID () всегда 1 в триггере - PullRequest
0 голосов
/ 11 мая 2019

У меня есть дело с каким-то наследством:

устройство -> 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
...