Avatar billede anjaskal Nybegynder
06. maj 2008 - 09:11 Der er 9 kommentarer og
1 løsning

Fremmednøgle i MySQl 5.0 (vha. navicat)

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!
Avatar billede anjaskal Nybegynder
06. maj 2008 - 09:31 #1
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.
Avatar billede coderdk Praktikant
06. maj 2008 - 10:08 #2
Du prøver vel at sætte en EntityID ind i tabel2 som ikke findes i tabel1?
Avatar billede anjaskal Nybegynder
06. maj 2008 - 10:32 #3
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...)???

"INSERT INTO abcEntityLine (EntityID, DriverID, RawdataID, ParentEntityLineID, DriverCalcAmount) " & _
" SELECT driver.ToEntityID, driver.DriverID, line.RawdataID, line.EntityLineID, " & calcSql & _
" FROM abcEntityLine AS line " & _
" JOIN abcDriver AS driver" & _
" ON driver.FromEntityID = " & EntityID & " AND line.EntityID = " & EntityID
Avatar billede coderdk Praktikant
06. maj 2008 - 10:39 #4
Jo, der er referentiel integritet - EntityID's som bliver sat ind i abcEntityLine skal eksistere i den anden tabel (abcEntity?) - Du kan jo prøve at skrive SQL'en ud på skærmen, for den som fejler?
Avatar billede anjaskal Nybegynder
06. maj 2008 - 10:50 #5
Ja, men der er ikke ref. int ifht. drivers.
Har lige fundet to drivers, der henviser til slettede entiteter. gad vide om det vil hjælpe at slette dem - og så oprette fremmednøgler der også. -jaja, man skal jo starte et sted.

Tror du at koden ovenfor er påvirket af det? jeg har ikke selv skrevet den, og er ikke 100-meter mester i SQL.
Avatar billede coderdk Praktikant
06. maj 2008 - 10:53 #6
Jeg er rimelig sikker på, at hvis du fjerner de records i driver-tabellen, som ikke har en modsvarende entity, vil din insert gå godt :)
Avatar billede anjaskal Nybegynder
06. maj 2008 - 11:53 #7
Sikke en masse rod i data, der kan opstå, når der ikke er styr på ref int.
Nu har jeg slettet en masse døde referencer og nu går det.

Nu skal jeg så til at optimere - må læse guides og tips og tricks for at finde den rigtige anvendelse af index. det er vist ikek helt ligemeget, vel?

Tusind tak for hjælpen.
Avatar billede anjaskal Nybegynder
06. maj 2008 - 11:56 #8
Nå, hvis du gider sende et svar, så lukker jeg lige den her med afgivelse af point.
Avatar billede coderdk Praktikant
06. maj 2008 - 12:22 #9
Ja indekser er meget vigtige - Brug EXPLAIN på ofte brugte statements, for at se om indexerne bliver benyttet eller om der skal andre til ;)
Avatar billede anjaskal Nybegynder
06. maj 2008 - 12:55 #10
Ikke forstået. (jeg gentager lige at jeg ikke er 100 meter haj til sQl :)
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