it-swarm.com.de

LAST_INSERT_ID () MySQL

Ich habe eine MySQL-Frage, die ich für recht einfach halte. Ich muss die LETZTE EINGEFÜGTE ID von table1 zurückgeben, wenn ich die folgende MySql-Abfrage ausführe:

INSERT INTO table1 (title,userid) VALUES ('test',1); 
INSERT INTO table2 (parentid,otherid,userid) VALUES (LAST_INSERT_ID(),4,1);
SELECT LAST_INSERT_ID();

Wie Sie verstehen können, gibt der aktuelle Code nur die LETZTE EINFÜGE-ID von Tabelle2 anstelle von Tabelle1 zurück. Wie kann ich die ID von Tabelle1 abrufen, auch wenn ich sie zwischen Tabelle2 einfüge?

135
Martin

Sie können die letzte Einfüge-ID in einer Variablen speichern:

INSERT INTO table1 (title,userid) VALUES ('test', 1); 
SET @last_id_in_table1 = LAST_INSERT_ID();
INSERT INTO table2 (parentid,otherid,userid) VALUES (@last_id_in_table1, 4, 1);    

Oder holen Sie sich die max id frm table1

INSERT INTO table1 (title,userid) VALUES ('test', 1); 
INSERT INTO table2 (parentid,otherid,userid) VALUES (LAST_INSERT_ID(), 4, 1); 
SELECT MAX(id) FROM table1;   
226
Julien Hoarau

Da Sie die vorherige LAST_INSERT_ID () tatsächlich in der zweiten Tabelle gespeichert haben, können Sie sie von dort abrufen:

INSERT INTO table1 (title,userid) VALUES ('test',1); 
INSERT INTO table2 (parentid,otherid,userid) VALUES (LAST_INSERT_ID(),4,1);
SELECT parentid FROM table2 WHERE id = LAST_INSERT_ID();
16
Artem Goutsoul

Auf diese Weise können Sie eine Zeile in zwei verschiedene Tabellen einfügen und einen Verweis auf beide Tabellen erstellen.

START TRANSACTION;
INSERT INTO accounttable(account_username) 
    VALUES('AnAccountName');
INSERT INTO profiletable(profile_account_id) 
    VALUES ((SELECT account_id FROM accounttable WHERE account_username='AnAccountName'));
    SET @profile_id = LAST_INSERT_ID(); 
UPDATE accounttable SET `account_profile_id` = @profile_id;
COMMIT;
13
Ospho

Ich hatte das gleiche Problem in Bash und ich mache so etwas:

mysql -D "dbname" -e "insert into table1 (myvalue) values ('${foo}');"

was gut funktioniert :-) aber

mysql -D "dbname" -e "insert into table1 (myvalue) values ('${foo}');set @last_insert_id = LAST_INSERT_ID();"
mysql -D "dbname" -e "insert into table2 (id_tab1) values (@last_insert_id);"

arbeite nicht Denn nach dem ersten Befehl wird die Shell von mysql abgemeldet und für den zweiten Befehl erneut angemeldet, und dann wird die Variable @last_insert_id nicht mehr gesetzt. Meine Lösung lautet:

lastinsertid=$(mysql -B -N -D "dbname" -e "insert into table1 (myvalue) values ('${foo}');select LAST_INSERT_ID();")
mysql -D "dbname" -e "insert into table2 (id_tab1) values (${lastinsertid});"

Vielleicht sucht jemand nach einer Lösung und schlägt ein :-)

3
Holger Seitter

Ist es möglich, die Variable last_id_in_table1 in eine PHP-Variable zu speichern, um sie später zu verwenden?

Mit dieser last_id muss ich einige Datensätze in einer anderen Tabelle mit dieser last_id anhängen, also brauche ich:

1) Machen Sie ein INSERT und holen Sie sich die last_id_in_table1

INSERT into Table1(name) values ("AAA"); 
SET @last_id_in_table1 = LAST_INSERT_ID();

2) AKTUALISIEREN Sie für unbestimmte Zeilen in einer anderen Tabelle diese Zeilen mit dem in der Einfügung generierten last_id_insert.

$element = array(some ids)    
foreach ($element as $e){ 
         UPDATE Table2 SET column1 = @last_id_in_table1 WHERE id = $e 
    }
0
Angel

Für keine InnoDB-Lösung: Sie können eine Prozedur don't forgot to set the the delimiter for storing the procedure with ;

CREATE PROCEDURE myproc(OUT id INT, IN otherid INT, IN title VARCHAR(255))
BEGIN
LOCK TABLES `table1` WRITE;
INSERT INTO `table1` ( `title` ) VALUES ( @title ); 
SET @id = LAST_INSERT_ID();
UNLOCK TABLES;
INSERT INTO `table2` ( `parentid`, `otherid`, `userid` ) VALUES (@id, @otherid, 1); 
END

Und du kannst es benutzen ...

SET @myid;
CALL myproc( @myid, 1, "my title" );
SELECT @myid;
0
raiserle