Avatar billede doozerii Nybegynder
14. december 2002 - 14:06 Der er 12 kommentarer og
2 løsninger

database håndtering (Mysql) get ID i forbindelse med inserts.

Hejsa

er det muligt at få ID'et på et nyt element når man indsætter det (dvs. så jeg ved hvilket id nye element har).

Det er lidt for bøvlet at skulle lave en select efter hvert Insert fordi jeg skal bruge id'et senere.

Java koden ser således ud :
try {
            sql = conn.createStatement();
            res = sql.executeQuery(
                "INSERT INTO handler (navn, adresse, postnr, bynavn, tlf, mobil, arbejdstlf, e_mail, personnr, Finansiering_ID, køb_ID, salg_ID)"+
                    " VALUES ("+HD.navn+","+HD.adresse+", "+HD.postnr+","+HD.by+","+HD.tlf+","+HD.mobil+","+HD.arbejdstlf+","+HD.e_mail +","+HD.personnr+", 0,-1,-1);");
               
            //        "INSERT INTO `handler` (`navn` , `adresse` , `postnr` , `by` , `tlf` ) VALUES (\'\', \'Hans Nielsen \', \'Skumlersrtasse 4 \', \'2837 \', \'Nørresnede \', \'28372761\');");
            //                res = sql.executeQuery("Select * from handler");
        } catch (SQLException e) {
            System.err.println("SQL INSERT statement creation failed.");
            e.printStackTrace();
       
        }
        try {
            res = sql.executeQuery("Select id from `handler` where salg_ID=-1");
            ID = res.getInt(1);
        } catch (SQLException e) {
            System.err.println("Error getting ID from created handel.");
            e.printStackTrace();
        }


Mvh
Kristoffer
Avatar billede arne_v Ekspert
14. december 2002 - 14:08 #1
Jeg tror at den løsning de fleste vælger er:
  - ikke at bruge et auto felt i databasen
  - selv generere en unik id i applikationen
  - gemme recorden med den id man kender
Avatar billede disky Nybegynder
14. december 2002 - 14:16 #2
Nej det kan du ikke gøre nemmere,

Du kan som arne siger selv generere det, men så skal du passe frygteligt på synkronisation af det osv.
Avatar billede doozerii Nybegynder
14. december 2002 - 14:17 #3
Well, det kan da ikke være så svært at få et id ud?
jeg lurede lidt i api'et, og der er en getGeneratedKey i statement interface klassen, men jeg kan ikke lige få den til at virke.

Men det lyder som om det var vejen at gå.
Avatar billede arne_v Ekspert
14. december 2002 - 14:21 #4
Ny lille goodie i JDK 1.4 !!

:-)

Men jeg vil ikke garantere at den altid virker.

Den returnerer et ResultSet som du kan processe ligesom
et ResuktSet fra en executeQuery.
Avatar billede disky Nybegynder
14. december 2002 - 14:22 #5
Fedt så lærte jeg også noget i dag :)

Tak Doozerii :)
Avatar billede doozerii Nybegynder
14. december 2002 - 14:24 #6
hmn, ja, og nu besluttede min eclipse sig for at den ikke havde lyst til at kører med 1.4'eren.
*suk*
- Nå, men det ser ellers fornuftigt ud.
Avatar billede arne_v Ekspert
14. december 2002 - 14:29 #7
Iøvrigt kan jeg lige se, at man skal have MySQL 3.0.0
for at det virker jævnfør:
  http://www.mysql.com/products/connector-j/
Avatar billede arne_v Ekspert
14. december 2002 - 14:30 #8
Altså MySQL JDBC 3.0.0 selvfølgelig.
Avatar billede arne_v Ekspert
14. december 2002 - 15:38 #9
Altså hvis du bruger JDK 1.4 og en MySQL JDBC driver som understøtter
JDBC 3.0 standarden, så kan du bruge:

stmt.executeUpdate("INSERT ...");
ResultSet genkey = stmt.getGeneratedKeys();
rs.next();
int key = rs.getInt(1);

[forudsætter at der kun er 1 generated key som er et heltal]
Hvis ikke betingelserne er opført så må du finde en alternativ
løsning.

Visse database har database specifikke muligheder. Lidt søgning
på nettet fandt at MySQL skulle have:
SELECT LAST_INSERT_ID()
der skulle returnere sidste ID (jeg har ikke testet).

Den eneste generelle metoide der vil virke med alle JDK og JDBC
drivere er selv at generere de keys. Der er en almindelig
accepteret metode til at generere dem: Scott Amblers high-low
approach.
Avatar billede doozerii Nybegynder
16. december 2002 - 13:03 #10
Hmm.. men problemet ved at generere keys, er jo at flere applikationer kan få problemer med ikke at generere de samme keys. - anyway, jeg synes egenligt det er "pænest" at lade databasen om det.
Avatar billede arne_v Ekspert
16. december 2002 - 14:43 #11
High-low tager sig af det problem på en effektiv måde.
Avatar billede arne_v Ekspert
16. december 2002 - 14:44 #12
Og ja du kan godt sige at det er pænest at lade databasen gøre det,
men du bliver afhængig af en specifik database så.
Avatar billede viht Nybegynder
17. december 2002 - 10:24 #13
Jeg har selv arbejdet med noget der ligner for noget tid siden. Det endte med jeg bare lod mysql tælle nøgler i Ordre tabellen op automatisk og så hver gang jeg gemte en ordre fik den en ekstra attribut "timestamp" = (currentTimeMilis + random(256) + lokal ip) Så når jeg skulle gemme ordrelinier hentede jeg bare det ordreId som havde samme timestamp som det der stod på ordren.

Jeg prøvede også getGeneratedKeys, men det virkede ikke som det skulle. Jeg brugte mysql 4.01a og innodb tabeller.

Løsningen fungerede dog selv med over 25 tråde der oprettede tilfældige ordrer med forskellige antal varer på.

Du kan jo også overveje at have en ordreId tabel du låser hver gang du skal have et ordreId og så tælle det op. Det er bare en hel***** meget samtidighed du mister på den måde.
Avatar billede doozerii Nybegynder
18. december 2002 - 10:16 #14
Jeg har lavet en løsning der virker med getGeneratedKeys, og det kører indtilvidere som det skal. - eneste hage er at man skal bruge connector v. 3 som stadigt er i beta (Jeg har ikke konstateret nogen fejl på den endnu.)
Men alt i alt virker projektet som det skal med getGeneratedKeys fra SDK 1.41
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
Kurser inden for grundlæggende programmering

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