references / cascade
In mijn INNOdb-database (das dubbel) wil ik referencies en cascade gaan gebruiken.
Maar hoe werkt dat?
Op http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html vind ik wel veel informatie, maar even wat korte vragen:
Moet ik de link bij het child-tabel maken of bij de moeder-tabel?
Stel, ik heb dit:
We kunnen dat inderdaad gewoon linken (school_id en leerkracht_id), maar dat is niet belangrijk.
Als ik een rij uit de tabel SCHOLEN verwijder moeten ook alle groepen van die school verwijderd worden.
Dat kan ik handmatig gaan doen, maar daar is INNOdb juist zo goed voor.
Want ik heb straks ook nog gebruikers die in een groep zitten... die moeten dus ook 'weg'.
Dat is flink wat lijnen trekken, maar hoe trek ik die?
Ik heb nu dit:
Maar daarop krijg ik de volgende fout:
#1005 - Can't create table '.\digiwerk\#sql-dc8_28.frm' (errno: 150) waar ik dus NIETS mee kan.
Geen tabel maken? Dat moet ook niet.
Dan zelf verder geprobeerd:
Daarop krijg ik #1452 - Cannot add or update a child row: a foreign key constraint fails (`digiwerk/#sql-dc8_38`, CONSTRAINT `#sql-dc8_38_ibfk_1` FOREIGN KEY (`school_id`) REFERENCES `scholen` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)...
Iemand die raad kan geven?
Maar hoe werkt dat?
Op http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html vind ik wel veel informatie, maar even wat korte vragen:
Moet ik de link bij het child-tabel maken of bij de moeder-tabel?
Stel, ik heb dit:
We kunnen dat inderdaad gewoon linken (school_id en leerkracht_id), maar dat is niet belangrijk.
Als ik een rij uit de tabel SCHOLEN verwijder moeten ook alle groepen van die school verwijderd worden.
Dat kan ik handmatig gaan doen, maar daar is INNOdb juist zo goed voor.
Want ik heb straks ook nog gebruikers die in een groep zitten... die moeten dus ook 'weg'.
Dat is flink wat lijnen trekken, maar hoe trek ik die?
Ik heb nu dit:
Code (php)
1
2
3
4
5
2
3
4
5
ALTER TABLE scholen
ADD FOREIGN KEY(id)
REFERENCES groepen(school_id)
ON DELETE CASCADE
ON UPDATE CASCADE
ADD FOREIGN KEY(id)
REFERENCES groepen(school_id)
ON DELETE CASCADE
ON UPDATE CASCADE
Maar daarop krijg ik de volgende fout:
#1005 - Can't create table '.\digiwerk\#sql-dc8_28.frm' (errno: 150) waar ik dus NIETS mee kan.
Geen tabel maken? Dat moet ook niet.
Dan zelf verder geprobeerd:
Code (php)
1
ALTER TABLE groepen ADD FOREIGN KEY(school_id) REFERENCES scholen(id) ON DELETE CASCADE ON UPDATE CASCADE
Daarop krijg ik #1452 - Cannot add or update a child row: a foreign key constraint fails (`digiwerk/#sql-dc8_38`, CONSTRAINT `#sql-dc8_38_ibfk_1` FOREIGN KEY (`school_id`) REFERENCES `scholen` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)...
Iemand die raad kan geven?
Gewijzigd op 01/01/1970 01:00:00 door Eddy Erkelens
Gesponsorde koppelingen:
Zijn de keys die in relatie staan wel allebei UNSIGNED?
Hoe doe ik dat?
Ik heb wel op beide een INDEX staan (scholen.id = PRIMARY, groepen.school_id = INDEX).
Ik heb wel op beide een INDEX staan (scholen.id = PRIMARY, groepen.school_id = INDEX).
Edit:
Via phpMyAdmin heb ik zowel scholen.id als groepenschool_id op UNSIGNED gezet (attribuut).

Voer ik daarna de goede SQL uit (bovenste van eerste post), dan krijg ik:
#1452 - Cannot add or update a child row: a foreign key constraint fails (`digiwerk/#sql-dc8_e8`, CONSTRAINT `#sql-dc8_e8_ibfk_1` FOREIGN KEY (`school_id`) REFERENCES `scholen` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)
Via phpMyAdmin heb ik zowel scholen.id als groepenschool_id op UNSIGNED gezet (attribuut).

Voer ik daarna de goede SQL uit (bovenste van eerste post), dan krijg ik:
#1452 - Cannot add or update a child row: a foreign key constraint fails (`digiwerk/#sql-dc8_e8`, CONSTRAINT `#sql-dc8_e8_ibfk_1` FOREIGN KEY (`school_id`) REFERENCES `scholen` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)
Gewijzigd op 01/01/1970 01:00:00 door Eddy Erkelens
Kan het zijn dat er al records in je tabellen zitten? Het is altijd lastiger om naderhand nog keys te veranderen.
Er staan inderdaad al records in.
Ik zal even proberen of ik die er uit kan gooien (en daarna terug kan zetten) en ondertussen even die keys kan toevoegen.
In ieder geval het proberen waard!
Ik zal even proberen of ik die er uit kan gooien (en daarna terug kan zetten) en ondertussen even die keys kan toevoegen.
In ieder geval het proberen waard!
Edit:
Even de database leeg gemaakt en nu kon/kan ik inderdaad deze references toevoegen.
Dat is allemaal gelukt.
In phpMyAdmin zit zelf ook de functie om dit aan te maken (omslachtig via eerst een INDEX maken), maar het gaat.
Nu het volgende probleem.
Alle relaties zijn gemaakt, maar nu kan ik geen data invoegen.
Ik voer in:
En dan krijg ik dit:
Een database-dump-idee: zie http://www.zunflappie.nl/temp/dbdump.htm
Wat is er aan de hand?
Als ik alle referenties verwijder kan ik wel weer invoegen, maar goed: dat is natuurlijk niet de bedoeling.
Of het ik de refenties verkeerd neergezet?
Bedoeling: ik verwijder een school > dan ook alle groepen > alle leerlingen (in die groepen) > al het werk (van die leerlingen)
Dus het is een flinke keten (kan ook halverwege gestart worden door een groep te verwijderen).
Maar dat de database zeg maar zichzelf schoon houdt.
Wat te doen?
Even de database leeg gemaakt en nu kon/kan ik inderdaad deze references toevoegen.
Dat is allemaal gelukt.
In phpMyAdmin zit zelf ook de functie om dit aan te maken (omslachtig via eerst een INDEX maken), maar het gaat.
Nu het volgende probleem.
Alle relaties zijn gemaakt, maar nu kan ik geen data invoegen.
Ik voer in:
Code (php)
1
INSERT INTO gebruikers (id, naam, wachtwoord, groep_id, school_id, rang_id, eerste_aanmelding, laatste_aanmelding) VALUES(1, 'Meester Erkelens', '9db5d20b05c8c9d9fba4240ec4f05ad0', 1, 1, 1, '2008-10-16', '2008-10-24 15:50:02');
En dan krijg ik dit:
Code (php)
1
#1452 - Cannot add or update a child row: a foreign key constraint fails (`digiwerk/gebruikers`, CONSTRAINT `gebruikers_ibfk_1` FOREIGN KEY (`groep_id`) REFERENCES `groepen` (`id`) ON DELETE CASCADE)
Een database-dump-idee: zie http://www.zunflappie.nl/temp/dbdump.htm
Wat is er aan de hand?
Als ik alle referenties verwijder kan ik wel weer invoegen, maar goed: dat is natuurlijk niet de bedoeling.
Of het ik de refenties verkeerd neergezet?
Bedoeling: ik verwijder een school > dan ook alle groepen > alle leerlingen (in die groepen) > al het werk (van die leerlingen)
Dus het is een flinke keten (kan ook halverwege gestart worden door een groep te verwijderen).
Maar dat de database zeg maar zichzelf schoon houdt.
Wat te doen?
Edit:
Het bleek dat je geen records kan toevoegen als er geen 'moeder' is.
Ik moest dus beginnen met de scholen (ipv gebruikers).
Vanaf inserten al moet het kloppen.
En er ontbrak daarbij de standaard-school, waardoor alles in de soep liep.
Dat is nu weer correct gemaakt!
Het bleek dat je geen records kan toevoegen als er geen 'moeder' is.
Ik moest dus beginnen met de scholen (ipv gebruikers).
Vanaf inserten al moet het kloppen.
En er ontbrak daarbij de standaard-school, waardoor alles in de soep liep.
Dat is nu weer correct gemaakt!
Gewijzigd op 01/01/1970 01:00:00 door Eddy Erkelens
Eddy,
Kan je me dat even uitleggen van die 'moeder'? wat is dat net? en hoe maak ik dat?
Kan je me dat even uitleggen van die 'moeder'? wat is dat net? en hoe maak ik dat?
@tikkes: Als je een record wilt toevoegen in tabel1 waarvan 1 van de velden refereert naar tabel2, dan moet je wel zorgen dat de bijbehorende data in tabel2 aanwezig is.



