Versio

references / cascade

Overzicht Reageren

Eddy Erkelens

Eddy Erkelens

25/10/2008 19:36:00
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
SCHOLEN
id
naam
plaats

GROEPEN
id
school_id
aantal_leerlingen
leerkracht_id


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)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
ALTER TABLE scholen
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)
PHP script in nieuw venster Selecteer het PHP script
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
 
PHP hulp

PHP hulp

25/05/2012 14:16:51
Gesponsorde koppelingen:
 
Jan Koehoorn

Jan Koehoorn

25/10/2008 19:39:00
Quote Anchor link
Zijn de keys die in relatie staan wel allebei UNSIGNED?
 
Eddy Erkelens

Eddy Erkelens

25/10/2008 19:51:00
Quote Anchor link
Hoe doe ik dat?
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).

http://www.postimage.org/Pq1ZkEd9.jpg


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
 
Jan Koehoorn

Jan Koehoorn

25/10/2008 20:02:00
Quote Anchor link
Kan het zijn dat er al records in je tabellen zitten? Het is altijd lastiger om naderhand nog keys te veranderen.
 
Eddy Erkelens

Eddy Erkelens

26/10/2008 08:03:00
Quote Anchor link
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!

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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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)
PHP script in nieuw venster Selecteer het PHP script
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!
Gewijzigd op 01/01/1970 01:00:00 door Eddy Erkelens
 
Tikkes C

Tikkes C

26/10/2008 10:14:00
Quote Anchor link
Eddy,

Kan je me dat even uitleggen van die 'moeder'? wat is dat net? en hoe maak ik dat?
 
Ano Niem

Ano Niem

26/10/2008 11:00:00
Quote Anchor link
@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.
 



Overzicht Reageren