26. marts 2015 - 12:58Der er
8 kommentarer og 1 løsning
Fremmednøgler driller (error 1452)
Jeg bruger phpMyAdmin og har lidt svært ved at få fremmednøgler til virke. Nogle gange gør de og andre gange ikke - og jeg kan ikke gennemskue, hvorfor (ikke) ...
Nu er jeg igen i problemer:
Jeg har tabellen "kb_kommuner", som indeholder en kolonne med de 98 kommuner. Desuden har jeg oprettet kolonnen "Storkredse" (varchar(16), utf8_danish, nej til nulværdi og ingen standardværdi).
Desuden har jeg oprettet tabellen "kb_storkredse" med en enkelt kolonne: "Storkreds" (varchar(16), utf8_danish, nej til nulværdi og ingen standardværdi). Kolonnen indeholder de 10 storkredse.
Nu vil jeg gerne parre de to, så jeg i "kb_kommuner" kan knytte hver kommune til en storkreds.
Men jeg får denne fejlbesked:
--- #1452 - Cannot add or update a child row: a foreign key constraint fails (`kkk_kommunetest20131111`.<result 2 when explaining filename '#sql-2477_5a58f7c'>, CONSTRAINT `#sql-2477_5a58f7c_ibfk_2` FOREIGN KEY (`storkredse`) REFERENCES `kb_storkredse` (`Storkreds`) ON ---
Jeg forstår, at noget skal indekseres, før man kan knytte tabellerne sammen, men jeg har tydeligvis ikke forstået det hele. Jeg synes, jeg har prøvet alle tænkelige kombinationsmuligheder med index, unique og primærnøgler på begge kolonner, men intet virker. Det er før lykkedes for mig, men det har nok været rene lykketræf.
Kan nogen fortælle mig, hvad der går galt her? Og hvad jeg skal huske på fremover ...
Det du vil opnå, tror jeg, er at du i kb_kommuner i kolonnen storkredse kun kan indføre gyldige storkredse, nemlig de storkredse du har defineret i tabellen kb_storkredse. Hvad man normalt ville gøre er at nummerere storkredsene, således at man ikke i kb_kommuner skal skrive ti-femten gange 'storkredsA'. Altså tabellen kb_storkredse giver du to kolonner, id, og storkreds.
dk_storkredse id storkreds 1 storkredsA 2 storkredsB o.s.v.
i dk_kommuner gør du så kolonnen Storkreds numerisk, så du der anvender storkredsnumrene:
dk_kommuner id navn storkreds 1 Assens 5 2 Bogense 5 3 Vejle 3 o.s.v.
Hvis du, når du fylder værdierne i dk_kommuner ud, kommer for skade at bruge et nummer for hvilket der ikke er nogen storkreds skal du i dk_kommuner definere en foreign key således:
Tak for din tid. Du har helt ret i, hvad jeg prøver at opnå.
Ved nærmere eftertanke, så handler mit spørgsmål måske nok mest om relationer ...
Jeg kan godt følge logikken med at nummerere storkredsene, så man sparer nogle indtastninger. Men jeg bruger phmMyAdmin, så jeg behøver ikke taste storkredsene hver gang, jeg vælger dem blot fra et rullepanel - det vil sige: det ville jeg kunne, hvis jeg ellers kunne skabe en relation mellem kb_kommuner og kb_storkredse! (at vælge fra rullepanel har den fordel, at jeg samtidig kan dobbelttjekke, at kommunerne bliver placeret i de rigtige storkredse).
Jeg har en tilsvarende tabel med regionerne, som også relaterer til en kolonne i kb_kommuner. kb_regioner har også kun en enkelt kolonne med navnene på de fem regioner. Det virker helt efter hensigten med et fint rullepanel i kb_kommuner. Jeg har forsøgt at lave kb_storkredse fuldstændigt som kb_regioner, men jeg kan ikke få lov til at lave en relation mellem kb_storkredse og kb_kommuner ...
Som tidligere nævnt, tror jeg, fejlen ligger i index/unique/primærnøgle, men jeg kan ikke gennemskue hvor :-(
Jeg har omdøbt kolonnen Storkreds til "storkreds_navn", så jeg (måske) nemmere kan kende forskel på de forskellige.
Så i kolonnen kb_kommuner.storkredse vil jeg gerne have lavet en relation til kb_storkredse.storkreds_navn.
#3 Det er denne query, der giver fejl 1452, som nævnt ovenfor:
ALTER TABLE `kb_kommuner` ADD FOREIGN KEY (`storkredse`) REFERENCES `kkk_kommunetest20131111`.`kb_storkredse`(`storkreds_navn`) ON DELETE NO ACTION ON UPDATE NO ACTION;
#4 Jeg har prøvet både med og uden. Jeg definerede den igen som primær nøgle efter dit indlæg, men jeg kan stadig ikke oprette en relation. I "tvillingen" dk_regioner (som virker) er der ingen primær nøgle.
Men nu prøvede jeg lige forfra. Og nu virker det(!).
Jeg oprettede kolonnen kb_kommuner.komm_storkreds. Til forskel fra tidligere, valgte jeg "Index" i rubrikken Indeks i phpMyAdmin, da jeg oprettede kolonnen.
Og så oprettede jeg tabellen kb_storkredse (selvfølgelig som InnoDB) og oprettede kolonnen storkreds_navn. Til forskel fra tidligere, valgte jeg "Primary" i rubrikken Indeks, da jeg oprettede kolonnen.
Mit problem tidligere har tydeligvis været, at jeg ikke har kunnet finde ud at at tilføje index og primær nøgle efterfølgende.
Tak til alle her i tråden - nu er jeg glad igen. Det var Eriks snak om primære nøgler, der endte med at føre til løsningen på problemet.
Hvis nogen vil have point for deres tid, så læg et svar.
Princippet er vel, at den eller de der har løst eller bidraget til en løsning på problemet i spørgsmålet skal have points. Jeg kan skønne fra #7, at mit indlæg ikke bidrog til løsningen (og ham du siger har bidraget erklærer ikke at ville have points.) Så det bliver nok til, at du skal lukke med eget svar.
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.