Pergunta

Eu tenho uma pergunta mySQL que acho que deve ser muito fácil. Preciso devolver o último ID inserido da Tabela1 quando executar a seguinte consulta 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();

Como você pode entender, o código atual retornará o último ID de inserção da Tabela 2 em vez da Tabela1, como posso obter o ID da Tabela1, mesmo que eu insira a Tabela 2 entre?

Foi útil?

Solução

Você pode armazenar o último ID de inserção em uma variável:

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 obtenha o max id frm tabela1

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;   

Outras dicas

Como você realmente armazenou o último last_insert_id () na segunda tabela, você pode obtê -lo a partir daí:

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

Isso permite que você insira uma linha em duas tabelas diferentes e cria uma referência às duas tabelas também.

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;

Eu tive o mesmo problema em Bash e estou fazendo algo assim:

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

que funciona bem :-) mas

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

Não funcione. Porque após o primeiro comando, o shell será logado no MySQL e logado novamente para o segundo comando e, em seguida, a variável @last_insert_id não está mais definida. Minha solução é:

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

Talvez alguém esteja procurando por uma solução uma festa :-)

Seria possível salvar a variável last_id_in_table1 em uma variável PHP para usá -la mais tarde?

Com este último_ID, preciso anexar alguns registros em outra tabela com este último_id, então eu preciso:

1) Faça uma inserção e obtenha o último_ID_IN_TABLE1

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

2) Para quaisquer linhas indeterminadas em outra tabela, atualizando essas linhas com o último_ID_INSERT gerado na inserção.

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

Para nenhuma solução InnoDB: você pode usar um procedimentodon'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 você pode usá -lo ...

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

Para o último e o segundo último:

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

Apenas para adicionar para o post Rodrigo, em vez de last_insert_id () na consulta, você pode usar o Selecionar Max (id) da Tabela1;, mas você deve usar (),

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

Temos apenas uma pessoa inserindo registros, então executo a seguinte consulta imediatamente após a inserção:

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

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

            $id = $row['id'];

}

Isso recupera o último ID do banco de dados.

Se você precisar ter do MySQL, após sua consulta, o último ID automático sem outra consulta, coloque seu código:

mysql_insert_id();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top