Question

J'ai une question de MySQL que je pense doit être assez facile. Je dois retourner le INSÉRÉ ID de LAST table1 quand je lance 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 va juste retourner le DERNIER INSERT ID de table2 au lieu de table1, comment puis-je l'id de table1 même si j'insérer dans table2 entre?

Était-ce utile?

La solution

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

Autres conseils

Depuis que vous avez réellement enregistré le précédent 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();

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

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;

J'ai eu le même problème dans bash et je fais quelque chose comme ceci:

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

qui fonctionne très 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 fonctionnent pas. Car après la première commande, le shell sera déconnecté de mysql et connecté à nouveau pour la deuxième commande, puis la @last_insert_id variable n'est pas définie plus. 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 d'un bash: -)

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

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

1) Faire une INSERT et obtenir le last_id_in_table1

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

2) Pour toutes les lignes hyperstatiques dans 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 
    }

pas de 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;

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

Juste pour ajouter post Rodrigo, au lieu de LAST_INSERT_ID () dans la 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)

Nous avons seulement une personne entrant dans les enregistrements, donc j'exécute la requête suivante immédiatement après l'insertion:

$result = $conn->query("SELECT * FROM corex ORDER BY id DESC LIMIT 1");

while ($row = $result->fetch_assoc()) {

            $id = $row['id'];

}

Ce dernier récupère les ID de la base de données.

Si vous avez besoin de mysql, après votre requête, le dernier identifiant automatique incrémentielle sans une autre requête, mettez dans votre code:

mysql_insert_id();
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top