webForumDet fria alternativet

Fråga angående INSERT

13 svar · 642 visningar · startad av learn

learnMedlem sedan jan. 20051 130 inlägg
#1

Kan man göra ngt liknande detta...

INSERT INTO tbl (ID, text)
VALUES (SELECT MAX(ID) FROM tbl2, 'testar')

...eller måste jag ha två separata querys? Jag vill alltså lägga in det högsta id-numret från en annan tabell.

LarsGMedlem sedan dec. 200012 464 inlägg
#2
 INSERT INTO tbl (ID, text)
VALUES ((SELECT MAX(ID) FROM tbl2), 'testar')

är giltig SQL men dock ej stött i de flesta DBMS.

 INSERT INTO tbl (ID, text)
SELECT MAX(ID),'testar' FROM tbl2

skall fungera dock.

learnMedlem sedan jan. 20051 130 inlägg
#3

LarsG skrev:

 INSERT INTO tbl (ID, text)
VALUES ((SELECT MAX(ID) FROM tbl2), 'testar')

Fungerade bra. Jag kör MySQL.

LarsGMedlem sedan dec. 200012 464 inlägg
#4

Är det här ett försök att få targ på värdet för en kolumn som är definierad som auto_increment?

learnMedlem sedan jan. 20051 130 inlägg
#5

LarsG skrev:

Är det här ett försök att få targ på värdet för en kolumn som är definierad som auto_increment?

Där slog du huvudet på spiken. :)

LarsGMedlem sedan dec. 200012 464 inlägg
#6

Då skall du inte använda max utan funktionen last_insert_id istället för en select.

learnMedlem sedan jan. 20051 130 inlägg
#7

LarsG skrev:

Då skall du inte använda max utan funktionen last_insert_id istället för en select.

OK, hur använder jag den? Jag vet, jag kan ju kika i manualen... men du får gärna statuera ett exempel. :)

LarsGMedlem sedan dec. 200012 464 inlägg
#8

Ok, jag statuerar ett exempel. Kika i manualen.

learnMedlem sedan jan. 20051 130 inlägg
#9

LAST_INSERT_ID() verkar vara det jag söker. Men hur vet queryn vilken tabell man menar. Det är ju teoretiskt möjligt att en annan användare lägger in en post i en annan tabell nästan precis samtidigt. Då kanske den andra användarens skapade ID hämtas istället för det rätta...

INSERT INTO foo (auto,text)
    VALUES(NULL,'text');              # generate ID by inserting NULL
INSERT INTO foo2 (id,text)
    VALUES(LAST_INSERT_ID(),'text');  # use ID in second table

R: Vad är egentligen skillnaden: (SELECT MAX(ID) FROM tbl2)?

LarsGMedlem sedan dec. 200012 464 inlägg
#10

Om du använder max kan du råka ut för det beskrev, att du får fel värde. last_insert_id returnerar det senaste skapade auto_increment-värdet på någon tabell i din anslutning. Det påverkas inte av vad andra användare tar sig för.

learnMedlem sedan jan. 20051 130 inlägg
#11

Aha, ja fattar!

learnMedlem sedan jan. 20051 130 inlägg
#12

Kom på en sak.

Om jag nu har 3 INSERT-querys, där jag i den andra och tredje vill lägga in det ID som skapades (auto_increment) i den första så blir det ju fel med last_insert_id... Varför? Jo, därför att i den andra queryn skapas också ett ID m.h.a. auto_increment, och det är ju inte detta som skall stoppas in i den tredje... Jag vill ha det sista ID som skapats i tabell 1 i den första INSERT-queryn.

LarsGMedlem sedan dec. 200012 464 inlägg
#13

Hämta värdet och lagra det i en variabel i ditt skript.

learnMedlem sedan jan. 20051 130 inlägg
#14

Mm ok.

Finns det ngt bättre, mindre omständigt sätt att göra det på i PHP än följande:

$sql_query = mysql_query("SELECT LAST_INSERT_ID() AS id");

$result = mysql_fetch_assoc($sql_query);

$last_insert_ID = $result['id'];

Ingen som har en bättre lösning?

256 ms totalt · 3 externa anrop · v20260731065814-full.16f3d68c
128 ms — hämta forumlista (db)
125 ms — hämta statistik (db)
129 ms — hämta tråd, inlägg och bilagor (db)