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 mehreresecond_item
s haben.users
könnensecond_item
s über Tabelleusers_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.
funktioniert in http://sqlfiddle.com/#!9/52b604/1 ein seltsamer MySQL Bug ist? –
+1 mindestens für die Schaffung eines minimalen Falles, um das Problem zu reproduzieren! Vielen Dank! Nicht viele Fragen tun das. –
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. –