web-dev-qa-db-fra.com

LAST_INSERT_ID () MySQL

J'ai une question sur MySQL qui, à mon avis, doit être assez simple. J'ai besoin de renvoyer le dernier identifiant inséré de table1 lorsque j'exécute la requête MySql suivante:

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

Comme vous pouvez le comprendre, le code actuel renverra simplement l'ID LAST INSERT de table2 au lieu de table1, comment puis-je obtenir l'ID de table1 même si j'insère dans table2 entre?

135
Martin

Vous pouvez stocker le dernier identifiant d'insertion dans une variable:

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);    

Ou obtenez l'id max 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

Puisque vous avez effectivement stocké la dernière LAST_INSERT_ID () dans la deuxième table, vous pouvez l'obtenir à partir de là:

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

Cela vous permet d'insérer une ligne dans 2 tables différentes et crée également une référence aux deux tables.

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

J'ai eu le même problème à Bash et je fais quelque chose comme ça:

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

qui fonctionne bien :-) Mais

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);"

ne travaille pas Parce qu'après la première commande, le shell sera déconnecté de mysql, puis reconnecté pour la deuxième commande, puis la variable @last_insert_id ne sera plus définie. Ma solution est:

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});"

Peut-être que quelqu'un est à la recherche d'une solution et bash :-)

3
Holger Seitter

Il serait possible de sauvegarder la variable last_id_in_table1 dans une variable php pour l'utiliser plus tard?

Avec ce last_id je dois attacher des enregistrements dans une autre table avec ce last_id, donc j'ai besoin de:

1) Faites un INSERT et obtenez le last_id_in_table1

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

2) Pour toutes les lignes indéterminées d'une autre table, MISE À JOUR DE ces lignes avec le last_id_insert généré dans l'insert.

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

Sans solution InnoDB: vous pouvez utiliser une procédure 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

Et vous pouvez l'utiliser ...

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