/ Forside / Teknologi / Udvikling / SQL / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
SQL
#NavnPoint
pmbruun 1704
niller 962
fehaar 730
Interkril.. 701
ellebye 510
pawel 510
rpje 405
pete 350
gibson 320
10  smorch 260
MySQL og AUTO_INCREMENT
Fra : Morten Winkler Jørge~


Dato : 08-07-03 12:43

Hej Alle.

I en MySQL tabel lignende denne
(id int primary key not null auto_increment, name varchar(255), .....)

vil jeg lave en indsæt
insert into ... values (0, "H.C.Andersen", ....)

og får det forventede resultat. Nemlig at H.C Andersen tilføjes min tabel og
får det næste ledige ID.

Mit problem er at jeg vil gerne have dette ID trukket ud. Jeg kunne så lave
en
select max(id) ...

men der kunne sagtens være en anden tråd der foretager en anden insert
"samtidig".

Hvordan løser jeg dette interessante problem i PHP med MySQL på et SunOS
system? Jeg vil gerne undgå lock på filer etc. og føler mig overbevist om
at jeg bare ikke kender den "rene" SQL løsning.


Mvh.
Morten W. Jørgensen

 
 
Jimmy (08-07-2003)
Kommentar
Fra : Jimmy


Dato : 08-07-03 13:12


"Morten Winkler Jørgensen" <mwj@INGEN_SPAM_TIL_MIG.mip.sdu.dk> wrote in
message news:beeaee$rir$1@news.net.uni-c.dk...
> Hej Alle.
>
> I en MySQL tabel lignende denne
> (id int primary key not null auto_increment, name varchar(255), .....)
>
> vil jeg lave en indsæt
> insert into ... values (0, "H.C.Andersen", ....)

Det er forkert at indsætte 0.
I givet fald skal du indsætte NULL, men det er unødvendigt.
Undlad at indsætte noget overhovedet i feltet ID.


> Mit problem er at jeg vil gerne have dette ID trukket ud.

SELECT LAST_INSERT_ID() AS Last_ID

Aliaset er for ASP's skyld.

Du kan læse mere på mysql.com omkring funktionen, som skal afvikles lige
efter din INSERT.

Mvh
Jimmy




Morten Winkler Jørge~ (08-07-2003)
Kommentar
Fra : Morten Winkler Jørge~


Dato : 08-07-03 13:46

Jimmy wrote:

>> insert into ... values (0, "H.C.Andersen", ....)
>
> Det er forkert at indsætte 0.
OK. Taget til efterretning.

> SELECT LAST_INSERT_ID() AS Last_ID
Jovist, men er der nogen garanti for at det bliver det ID jeg oprette med
min insert lige før. Kunne det ikke være et ID genereret af en INSERT fra
en anden forbindelse der kører parallelt?
Det syntes jeg ikke manualen på Mysql.com nævner noget om. Måske er det bare
undersorstået at det hele arbejder på forbindelsesniveau?

Morten



Jesper Stocholm (08-07-2003)
Kommentar
Fra : Jesper Stocholm


Dato : 08-07-03 14:54

Morten Winkler Jørgensen wrote :

> Jimmy wrote:
>> SELECT LAST_INSERT_ID() AS Last_ID
> Jovist, men er der nogen garanti for at det bliver det ID jeg oprette
> med min insert lige før. Kunne det ikke være et ID genereret af en
> INSERT fra en anden forbindelse der kører parallelt?

Du kan vel lave en table-lock under dine operationer. Med mindre der er
ekstremt mange forbindelser til din db, så kan det vel ikke give
problemer at du laver

table lock
   insert
   retrieve last id
table unlock

Med mindre du rent faktisk bruger at dit auto-id er stigende, kan du jo
også vælge selv at lave dit id inden du sætter det ind. Dermed behøver du
ikke at slå op i din tabel for at finde det sidste indsatte id.

--
Jesper Stocholm - http://stocholm.dk
if you are competing with the darknet, you must compete on the darknet's
own terms: that is convenience and low cost rather than additional
security. ( http://crypto.stanford.edu/DRM2002/darknet5.doc )

Jimmy (08-07-2003)
Kommentar
Fra : Jimmy


Dato : 08-07-03 16:09


"Morten Winkler Jørgensen" <mwj@INGEN_SPAM_TIL_MIG.mip.sdu.dk> wrote in
message news:beee4e$spj$1@news.net.uni-c.dk...
> Jimmy wrote:
>
> >> insert into ... values (0, "H.C.Andersen", ....)
> >
> > Det er forkert at indsætte 0.
> OK. Taget til efterretning.
>
> > SELECT LAST_INSERT_ID() AS Last_ID

> Jovist, men er der nogen garanti for at det bliver det ID jeg oprette med
> min insert lige før.

Ja da.
Det er hele pointen med funktionen

> Kunne det ikke være et ID genereret af en INSERT fra
> en anden forbindelse der kører parallelt?

Nej.


> Det syntes jeg ikke manualen på Mysql.com nævner noget om. Måske er det
bare
> undersorstået at det hele arbejder på forbindelsesniveau?

De angiver, at det fungerer på en "connection level basis", hvilket er din
aktuelle forbindelse.
Du kan være helt rolig for at du får det rette ID, hvis du kalder den efter
din INSERT og før den næste INSERT.

mvh
Jimmy



Morten Winkler Jørge~ (09-07-2003)
Kommentar
Fra : Morten Winkler Jørge~


Dato : 09-07-03 11:58

Jamen, så er alt jo i skønneste uorden.

0x3E8 tak for hjælpen

Morten

Martin C. Petersen (08-07-2003)
Kommentar
Fra : Martin C. Petersen


Dato : 08-07-03 16:16

"Jimmy" <nyhedsgruppe@get2net.dk> skrev i en meddelelse
news:IxyOa.109$ce1.79@news.get2net.dk...
> SELECT LAST_INSERT_ID() AS Last_ID
Eller direkte med mysql_insert_id() i php..


Martin



Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408938
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste