24. februar 2003 - 15:31Der 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?
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...
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() !!
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.