2017-11-13 9 views
4

ich ein paar Tische haben:MySQL - Auf DELETE CASCADE-Einschränkung tut es nicht Aufgabe ist richtig

  • users voller Benutzer.
  • item ist voller Gegenstände.
  • item kann mehrere second_item s haben.
  • users können second_item s über Tabelle users_items haben.

Als ich ein item alle second_item und users_items löschen sollte auch entfernt werden. Also habe ich einige Einschränkungen festgelegt, die untergeordnete Tabellensätze löschen sollen. Aber es lässt den Rekord in users_items.

Hier ist meine MySQL-Abfragen:

CREATE TABLE `item` (
    `id` int(10) UNSIGNED NOT NULL, 
    `name` varchar(63) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `item` (`id`, `name`) VALUES (1, 'test'); 

CREATE TABLE `second_item` (
    `id` int(10) UNSIGNED NOT NULL, 
    `item_id` int(10) UNSIGNED DEFAULT NULL, 
    `name` varchar(255) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `second_item` (`id`, `item_id`, `name`) VALUES 
(1, 1, 'test'); 

CREATE TABLE `users` (
    `id` int(10) UNSIGNED NOT NULL, 
    `email` varchar(200) DEFAULT NULL, 
    `password` varchar(255) DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `users` (`id`, `email`, `password`) VALUES (1, 'test', 'test'); 

CREATE TABLE `users_items` (
    `id` int(10) UNSIGNED NOT NULL, 
    `user_id` int(10) UNSIGNED DEFAULT NULL, 
    `item_id` int(10) UNSIGNED DEFAULT NULL, 
    `item_second_id` int(10) UNSIGNED DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `users_items` (`id`, `user_id`, `item_id`, `item_second_id`) VALUES (1, 1, 1, 1); 

ALTER TABLE `second_item` 
    ADD PRIMARY KEY (`id`), 
    ADD KEY `item_id` (`item_id`); 

ALTER TABLE `item` ADD PRIMARY KEY (`id`); 

ALTER TABLE `users` ADD PRIMARY KEY (`id`); 

ALTER TABLE `users_items` 
    ADD PRIMARY KEY (`id`), 
    ADD KEY `user_id` (`user_id`), 
    ADD KEY `item_id` (`item_id`), 
    ADD KEY `item_second_id` (`item_second_id`); 


ALTER TABLE `second_item` 
    ADD CONSTRAINT `constraint1` FOREIGN KEY (`item_id`) REFERENCES `item` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; 

ALTER TABLE `users_items` 
    ADD CONSTRAINT `constraint2` FOREIGN KEY (`item_id`) REFERENCES `item` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 
    ADD CONSTRAINT `constraint3` FOREIGN KEY (`item_second_id`) REFERENCES `second_item` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, 
    ADD CONSTRAINT `constraint4` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; 

Ich versuche, die folgende Löschabfrage zu tun, aber es hinterlässt einen Rekord in users_items:

DELETE FROM `item` WHERE `item`.`id` = 1; 

Dieser "Fehler" geschieht auf:

  • WAMP (Serverversion: 5.7.16 - MySQL Community Server (GPL))
  • UBUNTU (5.7.20-0ubuntu0.16.04.1 - (Ubuntu))

EDITED:

Der Fehler durch die Reihenfolge verursacht Sie Einschränkungen hinzu:

ALTER TABLE `users_items` 
    ADD CONSTRAINT `constraint1` FOREIGN KEY (`item_id`) REFERENCES `item` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 
    ADD CONSTRAINT `constraint2` FOREIGN KEY (`item_second_id`) REFERENCES `second_item` (`id`) ON DELETE SET NULL ON UPDATE CASCADE, 
    ADD CONSTRAINT `constraint3` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; 

ALTER TABLE `second_item` 
    ADD CONSTRAINT `constraint4` FOREIGN KEY (`item_id`) REFERENCES `item` (`id`) ON DELETE CASCADE ON UPDATE CASCADE; 

Auf diese Weise es ist repariert.

+0

funktioniert in http://sqlfiddle.com/#!9/52b604/1 ein seltsamer MySQL Bug ist? –

+1

+1 mindestens für die Schaffung eines minimalen Falles, um das Problem zu reproduzieren! Vielen Dank! Nicht viele Fragen tun das. –

+1

Ich habe auch auf meiner lokalen MySQL-Instanz getestet. Es funktioniert, nachdem ich das Löschen von 'item' ausgeführt habe, sehe ich, dass die Zeile in' users_items' ebenfalls gelöscht wurde. Ich schlage vor, dass Sie Ihren Test sorgfältig wiederholen. Du musst einen Fehler gemacht haben. –

Antwort

1

Ich hatte in der Tat die gleichen Ergebnisse wie Sie hatten. Auch die Lösung gefunden;)

Ändern Sie die Reihenfolge Ihrer Einschränkungen in Ihrem SQL-Code. Dies wird dein Problem lösen.

Ich denke, der

+0

habe ich tatsächlich herausgefunden;) danke Kumpel. – degebine