Ik heb de volgende situatie:
Een tabel met gebruikers en de volgende kolommen:
geb_ID, geb_naam, geb_baas
Nu is geb_baas een vreemde sleutel die verwijst naar geb_ID. De baas van een gebruiker is immers ook een gebruiker.
Ik heb een ON UPDATE cascade en ON DELETE set null. wijzig ik het geb_id van een baas dan zou dit bij alle records waar geb_baas = geb_id moeten worden geüpdate.
Dit werkt echter niet, ik krijg de volgende foutmelding:
Op de mysql site las ik dit:
Ik snap dat het in een koppeltabel kan maar dat vind ik eigenlijk weer zo'n omweg.
Hier de sql export van de tabel:
Een tabel met gebruikers en de volgende kolommen:
geb_ID, geb_naam, geb_baas
Nu is geb_baas een vreemde sleutel die verwijst naar geb_ID. De baas van een gebruiker is immers ook een gebruiker.
Ik heb een ON UPDATE cascade en ON DELETE set null. wijzig ik het geb_id van een baas dan zou dit bij alle records waar geb_baas = geb_id moeten worden geüpdate.
Dit werkt echter niet, ik krijg de volgende foutmelding:
code:
1
| #1451 - Cannot delete or update a parent row: a foreign key constraint fails (`xxxt/test`, CONSTRAINT `test_ibfk_1` FOREIGN KEY (`geb_baas`) REFERENCES `test` (`geb_id`) ON DELETE CASCADE ON UPDATE SET NULL) |
Op de mysql site las ik dit:
Het is dus kennelijk niet mogelijk op deze manier, maar hoe dan wel? Ik heb al geëxperimenteerd met triggers maar kom er niet goed uit wat er fout is aan deze trigger:If ON UPDATE CASCADE or ON UPDATE SET NULL recurses to update the same table it has previously updated during the cascade, it acts like RESTRICT. This means that you cannot use self-referential ON UPDATE CASCADE or ON UPDATE SET NULL operations. This is to prevent infinite loops resulting from cascaded updates. A self-referential ON DELETE SET NULL, on the other hand, is possible, as is a self-referential ON DELETE CASCADE. Cascading operations may not be nested more than 15 levels deep.
code:
1
2
3
4
5
| CREATE TRIGGER zetbaas AFTER UPDATE ON test FOR EACH ROW BEGIN UPDATE test set geb_baas = NEW.geb_id WHERE geb_baas = OLD.geb_id END |
Ik snap dat het in een koppeltabel kan maar dat vind ik eigenlijk weer zo'n omweg.
Hier de sql export van de tabel:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| CREATE TABLE `test` ( `geb_id` smallint(5) unsigned NOT NULL default '0', `geb_naam` varchar(50) NOT NULL, `geb_baas` smallint(5) unsigned default NULL, PRIMARY KEY (`geb_id`), KEY `geb_baas` (`geb_baas`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; -- -- Gegevens worden uitgevoerd voor tabel `test` -- INSERT INTO `test` (`geb_id`, `geb_naam`, `geb_baas`) VALUES (1, 'Flipje de Vries', NULL), (2, 'Henk Schoorsteen', 1); -- -- Beperkingen voor tabel `test` -- ALTER TABLE `test` ADD CONSTRAINT `test_ibfk_1` FOREIGN KEY (`geb_baas`) REFERENCES `test` (`geb_id`) ON DELETE SET NULL ON UPDATE CASCADE; |