2015-11-19 2 views
1

У меня есть две таблицы 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, надежда, что помогает:

Database Design

+0

Можете ли вы опубликовать некоторые тестовые данные и результаты вы ожидаете? – wchiquito

+0

Правильно ли выполняется '' DELETE''', когда вы запускаете индивидуально (отдельно). Или 'DISTINCT' может быть противоречивым. –

+0

Попробуйте удалить один идентификатор сначала с помощью этой процедуры0 –

ответ

0

Почему вы используете подзапрос? Вы можете сделать то, что вам нужно с триггером следующим образом:

DELIMITER // 

CREATE TRIGGER `clear_traffic_alternativeRoute` 
    AFTER DELETE ON `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); 
    */ 
    DELETE FROM `traffic_alternativeRoute` 
    WHERE `altRoute_id` NOT IN (OLD.`altRoute_id`); 
END// 

DELIMITER ; 

SQL Fiddle demo

+0

Я тестировал вашу версию триггера, но он все еще не работает. Все записи из t2 (alternativeRoute_addressInformation) удаляются (также записи с другим идентификатором). Положительным является то, что теперь он работает правильно для T1 (alternativeRoute). –

+0

@ Dev0x: Вы видели [SQL Fiddle demo] (http://sqlfiddle.com/#!9/3a81b8e/1)? Можете ли вы показать инструкцию 'DELETE'? Можем ли мы увидеть структуру ваших таблиц ?. – wchiquito

+0

Я добавил создание табличных запросов на главный пост!В настоящее время я удаляю записи вручную через phpMyAdmin, например: DELETE FROM 'traffic' .'traffic_alternativeRoute_addressInformation' WHERE' traffic_alternativeRoute_addressInformation'.'altRouteAddress_id' = 274. Это то, что вы просили? –

Смежные вопросы