Avatar billede dsj Nybegynder
24. februar 2003 - 15:31 Der er 2 kommentarer og
1 løsning

Returnering af autonummereret primærnøgle

Jeg har et designmæssigt problem som jeg en gang imellem støder på. Jeg har en applikation hvor jeg opretter en sang og umiddelbart efter (helst i samme transaktion) skal sangen tilføjes en default-gruppe (dermed to tabeller Song og Group med en forbindelses-tabel som realisering af en mange-til-mange associering):

Song <-- Contains --> Group

Tabellen contains består en autonummereret primærnøgle og Song's og Group's primærnøgler.

Når nu sangen er oprettet skal der indsættes en tuppel i Contains som indeholder primærnøglen fra den nyoprettet sang, som jeg jo ikke har, da den er autonummereret.

Spørgsmålet er så, hvordan får jeg på bedste måde (performance) fat i sangens primærnøgle? Jeg anvender i øvrigt en Interbase-database - har den nogle funktioner der kunne være anvendelige?
Avatar billede the.sandman Nybegynder
24. februar 2003 - 20:49 #1
hej

der henstår nogle åbne spørgsmål:
1. hvad mener du med autogenereret primærnøgle?!? (bruger du funktionen gen_id..?)

2. hvilkent sprog benytter du til tilgang til Interbasen?!? (PHP, Delphi, C++)

når du producerer en mange-til-mange relation kan det - som du nævner - ofte være nødvendigt at kende det genererede nummer til en detail-tabels fremmednøgle-brug... HVIS du bruger GEN_ID i en insert skal du være opmærksom på muligheden for at trække det genererede nummer hjem på klienten med SQL'en:

select gen_id(<din_generator>, 1) from rdb$database

og når du har gjort det, tja, så kan du bruge denne værdi både i master og detail... dette kan gøres enten på klient-siden (PHP, Delphi mv) eller alternativt - og endnu bedre - i en stored procedure...

endelig har du også muligheden for at lave en:

select max(<din_auto_attribut>) from <din_tabel>

MEN den holder absolut ikke i et flerbruger-miljø og er ikke at anbefale...


håber dette hjalp..!
Avatar billede dsj Nybegynder
24. februar 2003 - 22:28 #2
Hmm det hjalp lidt. Her nogle kommentarer:

1. Jeg udvikler i Java og systemet består af en tung klient m. lokal database; som synkroniserer op mod en central database "overvåget" af en java-server-applikation.
2. Jeg har endnu ikke fået interbase til at virke og tester foreløbig mod en MySQL. Jeg har ikke megen kendskab til interbase, men jeg ved en del om PostgreSQL og dermed forskellene på MySQL og en "mere rigtig" database.
3. I Postgres kan man lige som i MySQL oprette et autonummereret felt (serial i Postrgres og auto_increment i MySQL), kan man ikke dette i interbase, eller hvordan foregår det der?
4. Jeg kender næsten ingenting til stored procedures, men måske man skulle undersøge det nærmere
5. Jeg vil også helst undgå max() !!
Avatar billede dsj Nybegynder
09. marts 2003 - 15:52 #3
lukker
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