168 votes

LAST_INSERT_ID() de MySQL

J'ai une base de données MySQL question qui je pense doit être assez facile. J'ai besoin de retourner le DERNIER ID INSÉRÉ from table1, quand je lance la suite de requête MySql:

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 sera tout juste de retour de la DERNIÈRE INSERTION ID de la table2 au lieu de table1, comment puis-je obtenir l'id de la table table1 même si je l'insérer dans table2 entre les deux?

283voto

Julien Hoarau Points 23987

Vous pouvez stocker le dernier id inséré 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 obtenir le 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;   

23voto

Artem Goutsoul Points 391

Depuis que vous avez réellement stocké les précédentes LAST_INSERT_ID() dans le deuxième tableau, 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();

14voto

Oliver Points 901

Cela vous permet d'insérer une ligne dans 2 tables différentes et crée une référence à la fois à tables de trop.

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;

-1voto

user2541471 Points 1

Pour la dernière et avant-dernière:

INSERT INTO `t_parent_user`(`u_id`, `p_id`) VALUES ((SELECT MAX(u_id-1) FROM user) ,(SELECT MAX(u_id) FROM user  ) );

-2voto

Pavlen Points 40

Juste pour ajouter de Rodrigo post, au lieu de LAST_INSERT_ID() dans une requête, vous pouvez utiliser SELECT MAX(id) from table1;, mais vous devez utiliser (),

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X