Avatar billede keysersoze Ekspert
21. august 2002 - 12:47 Der er 16 kommentarer og
1 løsning

id på netop indsatte post i mysql

dette virker fint hos mig

SQL2 = "SELECT last_insert_id() AS id"
    Set rs = conn.Execute(SQL2)
   
id = rs(0)

men på azero hvor siden skal ligge virker det ikke - der kommer fejlen "Driver does not support this parameter" - nogle ide til hvad der kan gøres?
Avatar billede mortenfn Nybegynder
21. august 2002 - 12:50 #1
select id from tabel

du vil altid få den sidste(højeste) id
Avatar billede keysersoze Ekspert
21. august 2002 - 12:52 #2
ja - men det er jo ikke særlig smart hvis der er to der opretter samtidig... så er der jo risiko for at de for forbyttet id
Avatar billede angelod Novice
21. august 2002 - 12:56 #3
"SELECT id FROM tabel WHERE nickname='$nickname'" måske?

Hvor nickname og $nickname blot er forslag til variabler.. Ved jo ikke hvad du benytter, men det skulle da forhindre fejlen med to på én gang, ikke? :o)
Avatar billede keysersoze Ekspert
21. august 2002 - 12:59 #4
det er korrekt - men det er ikke den korrekte måde at gøre det på - og der er stadig en usikkerhedsfaktor som blandt andet skyldes den ønskede opbygning fra kunden
Avatar billede disky Nybegynder
21. august 2002 - 13:02 #5
mortenfn:
Den returnere alle ID's i tabellen.

keysersoze:
Hvis vi forudsætter at ID er auto_increment så returnerer

select max(id) from tabel

altid sidste brugte ID.
Avatar billede keysersoze Ekspert
21. august 2002 - 13:05 #6
disky >> det er korrekt - men igen er der er risikofaktor hvis to eller flere indsætter poster samtidig...
Avatar billede mortenfn Nybegynder
21. august 2002 - 13:05 #7
-> disky det er rigtigt men du kan jo bare vise den sidste, men din er rigtig for den retunerer kun et resultat

men auto_inc  kan to ikke få den samme id
Avatar billede angelod Novice
21. august 2002 - 13:09 #8
Jeg kan ikke rigtig se hvad forskellen er på at få det sidste indsatte id med 'last_insert_id()' og så få det med 'max(id)'. Det er da den samme sikkerheds-risiko der spiller ind, ikke?
Avatar billede disky Nybegynder
21. august 2002 - 13:13 #9
angelod:
Du har helt ret.

mortenfn:
Det gør en stor forskel om du får et resultat tilbage med 1 værdi eller 50 millioner værdier (stor DB)
Avatar billede keysersoze Ekspert
21. august 2002 - 13:14 #10
nej - for med mit eksempel tages det sidst indsatte id i forhold til den netop udførte sql på den pågældende side... derfor vil id aldrig blive forbyttet
Avatar billede disky Nybegynder
21. august 2002 - 13:21 #11
det gør max(id) heller ikke

Den tager jo netop den højeste værdi i basen, balladen med begge løsninger er at der kan ske en insert imellem update og select.

Derfor skal du køre med transaktioner, så du sikre at ingen afbryder dig.
Avatar billede keysersoze Ekspert
21. august 2002 - 13:28 #12
jeg gider ikke diskutere - sådan som scriptet er opbygget og skal bruges kan jeg ikke bruge max(id) fordi hvis 13450239 indsætter en post samtdig risikerer jeg at id bliver forbyttet.

med mit eksempel kan 234823045 indsætte en post samtidig og ingen forbyttes fordi "SELECT last_insert_id() AS id" udelukkende kigger på den sidst udførte "insert into" på den pågældende side med den pågældende bruger. det den gør svarer lidt til angelod's første kommentar... bortset fra at "SELECT last_insert_id() AS id" er totalt lige glad med om der oprettet en masse fuldstædnig ens poster på præcis samme tid... de vil ALDRIG blive forbyttet!

det jeg ønsker er ikke forklaringer men en løsning eller funktion der gør præcis det samme som min ovenstående, men som virker på azero
Avatar billede keysersoze Ekspert
21. august 2002 - 13:36 #13
måske er dette nok lidt nyttig info - havde jeg sagt det med det samme havde der slet ikke været en diskution om det

selve sql'en virker perfekt - det er ikke den der er problemet... problemet består údelukkende i "id = rs(0)"
Avatar billede jangravgaard Nybegynder
21. august 2002 - 15:24 #14
kan du ikke bare låse tabellen mens du indsætter og hiver ud igen ??
Avatar billede keysersoze Ekspert
21. august 2002 - 15:31 #15
giv mig et eksempel - så vil jeg se om jeg kan bruge det
Avatar billede jangravgaard Nybegynder
21. august 2002 - 23:33 #16
Noget i denne stil:
SQL1 = "lock table tablename write"
    conn.Execute(SQL1)
SQL2 = "SELECT last_insert_id() AS id"
    Set rs2 = conn.Execute(SQL2)
SQL3 = "unlock tables"
    conn.Execute(SQL3)
Avatar billede keysersoze Ekspert
04. oktober 2002 - 19:06 #17
problemet er løst - det var simpelthen bare en gammel MDAC driver og løsningen blev at sitet blev flyttet til en server med version 2.7 i stedet for 2.5
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