Avatar billede esquimal Nybegynder
06. maj 2004 - 09:09 Der er 7 kommentarer og
2 løsninger

Gammel DB Struktur, foreign keys skal tilføjes

Hej eksperter

Jeg sidder med et lidt spøjst problem. For et par år tilbage lavede jeg en web applikation for et firma. Dengang det blev udviklet var jeg temmelig grøn hvad angår databaser og brugte derfor ikke foreign keys o.lign.
Men systemet kører altså stadig væk og nogle af tabellerne har nu ca. 70000 records.

Jeg ønsker nu at lave constraints mellem nogle af tabllerne men får selvfølgelig ikke lov pga. integritets problemer. Jeg har så prøvet at lave en ny tabel på grundlag af den gamle, tømme den originale, oprette foreign keys til den anden tabel, og derefter importere data igen. Men jeg får stadig samme fejl om integritet (Mit håb havde været at den blot skippede dem som ikke overholdt integriteten, men det gør den altså ikke). Jeg har prøvet med pg_dump og psql import, og via phppgadmin, men det giver samme fejl.

Nogle gode forslag til hvordan jeg får opretter foreign keys og beholder det data der overholder integriteten?
Avatar billede cyb Nybegynder
06. maj 2004 - 09:56 #1
Select på hvilke rækker der ikke overholder dine constraints og derefter rette disse linjer manuelt.
Avatar billede esquimal Nybegynder
06. maj 2004 - 11:05 #2
Ok, hvordan laver man sådan en? Jeg har prøvet at selecte de rækker som ikke er ens i de to tabeller men det giver jo et mærkeligt join med alt for meget output?
Avatar billede cyb Nybegynder
06. maj 2004 - 11:52 #3
Jeg er ikke ekspert i postgreSQL - men i microsoft sql kunne det være noget i stil af:
SELECT * FROM Table1 WHERE Table1.ForeignKey NOT IN (SELECT Table2.PrimaryKey FROM Table2)

Husk du skal først lige tjekke at du kan sætte primarykey på før du kan sætte foreign key på.
Avatar billede esquimal Nybegynder
06. maj 2004 - 12:27 #4
Selvfølgelig, jeg havde helt glemt den der IN kommando.

Primary keys er der ingen problemer med, jeg prøver lige dit forslag og vender tilbage
Avatar billede esquimal Nybegynder
06. maj 2004 - 12:37 #5
Det virkede lige som det skulle, derefter var det bare at fyre denne af:

DELETE FROM Table1 where Table1.PrimaryKey IN (SELECT Table1.PrimaryKey FROM Table1 WHERE Table1.ForeignKey NOT IN (SELECT Table2.PrimaryKey FROM Table2))

Jeg tør godt slette alle data der ikke overholder integriteten da det formentlig er test/fejl data. Der var iøvrigt kun 427 rækker ud af de 70000 :O)

Tak for hjælpen....
Avatar billede esquimal Nybegynder
06. maj 2004 - 13:13 #6
hmm, den vil ikke rigtig lade mig acceptere dit svar.
Avatar billede cyb Nybegynder
06. maj 2004 - 13:22 #7
Du skal markere mit navn i listboxen (hvor der kun er en linje) for at kunne acceptere svaret.
Avatar billede esquimal Nybegynder
06. maj 2004 - 14:11 #8
Ahh....hehe det er lang tid siden jeg har bruge det her
Avatar billede cyb Nybegynder
06. maj 2004 - 14:13 #9
:-) ... Jeg havde også problemer med det da de lavede det om ;-)
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