У меня есть две таблицы t1 (alternativeRoute) & t2 (alternativeRoute_addressInformation).MySQL Trigger удаляет целую таблицу вместо одной записи
Задача состоит в том, что если в T2 все записи с одинаковым идентификатором удаляются (все в одном запросе на удаление или подряд), то запись в T1 также должна быть удалена.
Для этого я создал SQL-запрос, который отлично работает, если я запустил его вручную после удаления записей из t2 с тем же идентификатором.
DELETE FROM traffic.traffic_alternativeRoute WHERE altRoute_id NOT IN (
SELECT distinct traffic.traffic_alternativeRoute_addressInformation.altRoute_id
FROM traffic.traffic_alternativeRoute_addressInformation);
Но я хочу, чтобы выполнить это действие автоматически, поэтому я решил создать триггер:
DELIMITER $$
CREATE TRIGGER clear_traffic_alternativeRoute
AFTER DELETE ON traffic.traffic_alternativeRoute_addressInformation
FOR EACH ROW
BEGIN
DELETE FROM traffic.traffic_alternativeRoute WHERE altRoute_id NOT IN (
SELECT distinct 'traffic.traffic_alternativeRoute_addressInformation.altRoute_id'
FROM traffic.traffic_alternativeRoute_addressInformation);
END; $$
DELIMITER ;
Теперь вопрос: Спусковой запускаемый, но вместо того, чтобы просто удалить запись из t1 , все записи из обеих таблиц удаляются.
У кого-нибудь есть идея, почему этот код не работает при использовании триггеров?
Тестовые данные:
Т1:
INSERT INTO `traffic_alternativeRoute` (`info_id`, `altRoute_id`, `altRoute_desc`) VALUES
(66, 63, '');
INSERT INTO `traffic_alternativeRoute` (`info_id`, `altRoute_id`, `altRoute_desc`) VALUES
(66, 64, '');
Т2:
INSERT INTO `traffic_alternativeRoute_addressInformation` (`altRoute_id`, altRouteAddress_id`, `altRoute_address`, `altRoute_address_houseNumber`, `altRoute_locality`, `altRoute_postal_code`, `altRoute_order_number`, `altRoute_pos_lat`, `altRoute_pos_lng`) VALUES
(63, 249, 'Kölner Straße', 445, 'Kürten', '51515', 1, 51.03150342683682, 7.209327220916748),
(63, 250, 'Kölner Straße', 488, 'Kürten', '51515', 2, 51.02742788461119, 7.205550670623779),
(64, 251, 'Engelsgasse', 14, 'Kürten', '51515', 3, 51.02900686236984, 7.199242115020752),
(64, 252, 'Cliev', 5, 'Kürten', '51515', 4, 51.03193525137229, 7.20728874206543);
Ожидаемый результат:
После того, как записи с ID 64, удаляются, Т1 должна содержать только с идентификационным номером 63.
EDIT:
Одна вещь, о которой я не говорил, а также не имею в виду больше, заключается в том, что у меня есть ON CASCADE на T1. Может ли это быть частью проблемы?
CREATE TABLE IF NOT EXISTS `traffic`.`traffic_alternativeRoute` (
`info_id` INT NULL COMMENT '',
`altRoute_id` INT NOT NULL AUTO_INCREMENT COMMENT '',
`altRoute_desc` VARCHAR(256) NULL COMMENT '',
PRIMARY KEY (`altRoute_id`) COMMENT '',
INDEX `fk_info_id_idx` (`info_id` ASC) COMMENT '',
CONSTRAINT `fk_info_id`
FOREIGN KEY (`info_id`)
REFERENCES `traffic`.`traffic_info` (`info_id`)
ON DELETE CASCADE
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
CREATE TABLE IF NOT EXISTS `traffic`.`traffic_alternativeRoute_addressInformation` (
`altRoute_id` INT NULL COMMENT '',
`altRouteAddress_id` INT NOT NULL AUTO_INCREMENT COMMENT '',
`altRoute_address` VARCHAR(128) NOT NULL COMMENT '',
`altRoute_address_houseNumber` INT NOT NULL COMMENT '',
`altRoute_locality` VARCHAR(45) NOT NULL COMMENT '',
`altRoute_postal_code` VARCHAR(10) NOT NULL COMMENT '',
`altRoute_order_number` INT NOT NULL COMMENT '',
`altRoute_pos_lat` DOUBLE NOT NULL COMMENT '',
`altRoute_pos_lng` DOUBLE NOT NULL COMMENT '',
PRIMARY KEY (`altRouteAddress_id`) COMMENT '',
INDEX `fk_altRoute_id_idx` (`altRoute_id` ASC) COMMENT '',
CONSTRAINT `fk_altRoute_id`
FOREIGN KEY (`altRoute_id`)
REFERENCES `traffic`.`traffic_alternativeRoute` (`altRoute_id`)
ON DELETE CASCADE
ON UPDATE NO ACTION)
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8
COLLATE = utf8_general_ci;
А вот entrie DB - ERD, надежда, что помогает:
Можете ли вы опубликовать некоторые тестовые данные и результаты вы ожидаете? – wchiquito
Правильно ли выполняется '' DELETE''', когда вы запускаете индивидуально (отдельно). Или 'DISTINCT' может быть противоречивым. –
Попробуйте удалить один идентификатор сначала с помощью этой процедуры0 –