Archief - MYSQL: foreign key binnen een tabel

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

Rayne Varga

Legacy Member
Ik heb een tabel 'categorie' met de volgende velden:
- id (primary key)
- naam
- parent_id

Het is de bedoeling om categoriën met subcategoriën in deze tabel te stoppen,
wat intussen al gelukt is. Het veld parent_id zou moeten verwijzen naar het veld id.

De bedoeling is om later op basis van het veld id een record te verwijderen en dat
automatisch alle subrecords ook verwijderd worden. Dit wou ik doen met de optie
ON DELETE CASCADE die ik kan meegeven bij het leggen van een foreign key.

Nu heb ik het volgende probleem: wanneer ik een foreign key probeer te maken met
de volgende query:

Code:
ALTER TABLE categorie ADD FOREIGN KEY (parent_id)  REFERENCES categorie(id) ON DELETE CASCADE
krijg ik deze foutmelding:
Code:
#1452 - Cannot add or update a child row: a foreign key constraint fails (`stock/#sql-122c_5d`, 
CONSTRAINT `#sql-122c_5d_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `categorie` (`id`))
Ik heb ook al geprobeerd om eerst een index te leggen op het veld parent_id en
daarna pas de foreign key toe te voegen maar dat geeft hetzelfde resultaat.

Op de site van mysql heb ik het volgende gevonden:
Note that InnoDB supports foreign key references within a table. In these cases, “child table records” really refers to dependent records within the same table.
Aangezien ik een InnoDB-tabel gebruik veronderstel ik dus dat het toch mogelijk moet zijn.

passero

Legacy Member
heb je al records in die DB zitten?

Het nadeel is dan dat ELKE record een parentID moet hebben dat bestaat of je krijgt een constraint error...

je eerste category, voorbeeld root:
(1,root,parentID)
root zal dus een parentID moeten hebben en ik weet niet of hij dan 1 zal aanvaarden...
Ik vermoed dat dus het probleem ergens ligt bij records die een parentID hebben die niet bestaat...

Rayne Varga

Legacy Member
passero zei:
heb je al records in die DB zitten?

Het nadeel is dan dat ELKE record een parentID moet hebben dat bestaat of je krijgt een constraint error...

je eerste category, voorbeeld root:
(1,root,parentID)
root zal dus een parentID moeten hebben en ik weet niet of hij dan 1 zal aanvaarden...
Ik vermoed dat dus het probleem ergens ligt bij records die een parentID hebben die niet bestaat...
Er zitten al records in de tabel ja. Elk record heeft een parentID, bij de root is dat 0 en daar zal waarschijnlijk het probleem zitten,
er bestaat namelijk geen record met id 0.

EDIT: probleem opgelost, ik heb alle parent_id's met waarde 0 vervangen door waarde NULL

Obliv`

Legacy Member
Rayne Varga zei:
Er zitten al records in de tabel ja. Elk record heeft een parentID, bij de root is dat 0 en daar zal waarschijnlijk het probleem zitten,
er bestaat namelijk geen record met id 0.

EDIT: probleem opgelost, ik heb alle parent_id's met waarde 0 vervangen door waarde NULL

Bij een recursieve koppeling moet natuurlijk de FK altijd de NULL-waarde toelaten.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan