Domanda

Ho una domanda MySQL che penso dovrebbe essere abbastanza semplice. Ho bisogno di restituire l'Ultimi inseriti ID da table1 quando si esegue la seguente query 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();

Come si può capire il codice corrente sarà solo restituire l'ultimo INSERIRE ID di table2 invece di table1, come posso ottenere l'id da table1 anche se inserisco in table2 tra?

È stato utile?

Soluzione

È possibile memorizzare l'ultimo inserto id in una variabile:

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

o ottenere 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;   

Altri suggerimenti

Dal momento che in realtà memorizzato il LAST_INSERT_ID precedente () nella seconda tabella, è possibile ottenere da 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();

Ciò consente di inserire una riga in 2 tabelle differenti e crea un riferimento a entrambi i tavoli troppo.

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;

Ho avuto lo stesso problema in bash e che sto facendo qualcosa di simile:

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

che funziona bene :-) Ma

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

non funzionano. Perché dopo il primo comando, la shell verrà disconnesso dalla mysql e registrato nuovamente per il secondo comando, e quindi il @last_insert_id variabile non è impostata più. La mia soluzione è:

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

Forse qualcuno è alla ricerca di una soluzione di un bash: -)

Sarebbe possibile salvare la variabile last_id_in_table1 in una variabile php per utilizzarla in seguito?

Con questo last_id ho bisogno di collegare alcuni record in un altro tavolo con questo last_id, quindi ho bisogno di:

1) Fare un INSERT e ottenere il last_id_in_table1

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

2) Per le righe indeterminated in un'altra tabella, AGGIORNAMENTO queste righe con il last_id_insert generato nell'inserto.

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

Per nessuna soluzione InnoDB: è possibile utilizzare una procedura di 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

E lo si può utilizzare ...

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

Per ultimo e il penultimo:

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

Giusto per aggiungere per Rodrigo posto, invece di LAST_INSERT_ID () nella query è possibile utilizzare SELEZIONE MAX (id) FROM tabella1 ;, ma è necessario utilizzare (),

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

Abbiamo solo una persona che entra record, quindi eseguo la seguente query subito dopo l'inserto:

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

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

            $id = $row['id'];

}

Questa recupera l'ultimo id dal database.

Se avete bisogno di avere da MySQL, dopo la tua ricerca, l'ultimo id auto-incrementale, senza un'altra query, inserire nel codice:

mysql_insert_id();
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top