Avatar billede KKKnudsen Nybegynder
26. marts 2015 - 12:58 Der 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 ...

På forhånd tak,
Kenneth
26. marts 2015 - 13:44 #1
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:

CREATE TABLE dk_kommuner .....
FOREIGN KEY (storkreds) REFERENCES dk_storkreds(id)

Så vil systemet kontrollere, at den værdi du har i dk_kommuner kolonnen storkreds eksisterer i dk_storkreds kolonnen id.

Jeg håber det hjælper.
Avatar billede KKKnudsen Nybegynder
26. marts 2015 - 14:20 #2
Hej Christian

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 :-(
26. marts 2015 - 14:53 #3
Prøv at vise os hvordan du har defineret fremmednøglen.
Avatar billede erikjacobsen Ekspert
26. marts 2015 - 15:11 #4
Og er "Storkreds"  i "kb_storkredse" defineret som primær nøgle?
Avatar billede KKKnudsen Nybegynder
26. marts 2015 - 18:06 #5
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.
Avatar billede erikjacobsen Ekspert
26. marts 2015 - 23:00 #6
Der skal altid være en primær nøgle.

Er alle dine tabeller af typen InnoDB?
Avatar billede KKKnudsen Nybegynder
27. marts 2015 - 14:16 #7
#6 - Ja, alt var InnoDB.

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.
28. marts 2015 - 15:40 #8
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.
Avatar billede KKKnudsen Nybegynder
29. marts 2015 - 01:27 #9
...
Avatar billede Ny bruger Nybegynder

Din løsning...

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.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester