Fremmednøgle i MySQl 5.0 (vha. navicat)

Tags:    databaser

hej

Jeg har et performanceproblem i min database, hvorfor jeg skal have oprettet index og fremmednøgler (så vidt jeg kan forstå).

Jeg er vant til at arbejde i Access, hvor man kan "tegne" relationer, og har nu lidt problemer med at oprette fremmednøgler i det knapt så grafiske Navicat.

Jeg har to tabeller:

tabel1
EntityID (primærnøgle)

Tabel2
EntityLineID (Primærnøgle)
EntityID (fremmednøgle-Wannabe)

Jeg har oprettet (unique) index på de to primære nøgler. tabellerne er InnoDB.
Da jeg vil oprette fremmednøglen i tabel2 (indeholdende data) får jeg fejlen :cannot add or update a child row.
da jeg sletter data går det fint. Men kan nu ikke oprette linier i tabel2.

Hvad er det lige, der går galt her?
Jeg har læst en bunke dokumentation på engelsk og kløjs lidt i deres anvendelse af "referenced table" og referencing table".
Jeg mener ikek selv at jeg er debil database-nød, men har sgu lidt svært ved at se, hvad der er galt her.
En entitet kan have mange linier, som via en fremmednøgle i tabel2 skal knyttes til entiteten i tabel1.

HJÆLP!



6 svar postet i denne tråd vises herunder
3 indlæg har modtaget i alt 3 karma
Sorter efter stemmer Sorter efter dato
Hej Anja,

Ja. Det skulle jeg mene.

Af nysgerrighed kunne man være fristet til at spørge hvilket firma du laver det for?

Noter at du kan oprette en defaulkt for den key, i fald at den ikke findes/gives ved oprettelse. Så virker det også. Denne default key skal du have oprettet en "Unknown" indgang til i tabellen hvor foregin key kommer fra.

Med venlig hilsen
Ieet





Indlæg senest redigeret d. 07.05.2008 09:12 af Bruger #12836
hej

Jeg har et performanceproblem i min database, hvorfor jeg skal have oprettet index og fremmednøgler (så vidt jeg kan forstå).


Foreign keys gør ikke noget for din performance. De er med til at sikre referentiel integritet. Tværtimod vil du få en lavere performance ved insert, da databasen skal checke dine constraints.


Jeg har oprettet (unique) index på de to primære nøgler. tabellerne er InnoDB.


Men du, at du har oprettet primær nøgler og derefter oprettet indexes på de samme felter? Det får du ikke så meget ud af, da primære nøgler er indekserede i forvejen.

/Jesper



Jeg er sikker på du kan finde en del information om performance optimering på http://www.mysqlperformanceblog.com



Cannot add or update a child row: a foreign key constraint fails (`abctool/abcentityline`, CONSTRAINT `abcentityline_ibfk_2` FOREIGN KEY (`EntityID`) REFERENCES `abcentity` (`EntityID`))
Result.asp, line 194

Det skal lige siges at jeg har en ASP-kode, der opretter linier, og det er den, der fejler - fejlmeddelelsen ses herovenfor.



Indlæg senest redigeret d. 06.05.2008 09:30 af Bruger #1893


Hej Anja,

Det ser ud til at din SQL forespørgsel til at oprette i Tabel2, forsøger at oprette med en EntityID som ikke eksisterer i Tabel1.

Prøv at udskrive din SQL forespørgsel i en response.write
Prøv at lave en SELECT i tabel1 op EntityID som bliver vist i forespørgslen.

Med venlig hilsen
Ieet





Ja, det kunne man jo synes. jeg kan dog få koden til at oprette ca. 113.000 linier MED fremmednøglen. Mens den UDEN kommer op på over 900.000 linier.

Det er denne kode, der opretter linierne:

- vil det sige at den prøver at oprette linier for entiteter, der findes drivere på, men som ikke findes (der er jo heller ikke referentiel integritet, så det kan jo godt lade sig gøre...)???

Fold kodeboks ind/udKode 




t