LAST_INSERT_ID () MySQL

У меня есть вопрос MySQL, который, я думаю, должен быть довольно простым. Мне нужно вернуть LAST INSERTED ID из таблицы 1, когда я запускаю следующий запрос 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();

Как вы понимаете, текущий код будет просто возвращать идентификатор LAST INSERT для table2 вместо table1, как я могу получить идентификатор из table1, даже если я вставлю в table2 между ними?

Ответы на вопрос(10)

INSERT INTO `t_parent_user`(`u_id`, `p_id`) VALUES ((SELECT MAX(u_id-1) FROM user) ,(SELECT MAX(u_id) FROM user  ) );
 snorbi14 окт. 2016 г., 16:40
Это решение небезопасно вне транзакции (то есть автокоммит включен) и внутри транзакции с уровнем изоляции транзакции ниже сериализуемого. Увидеть:en.wikipedia.org/wiki/Isolation_(database_systems)
Решение Вопроса

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

Или получите максимальный идентификатор от 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;   
 Rob Starling17 янв. 2013 г., 04:38
Макс не очень хорошая идея, так как вы можете проиграть гонку с другим инсертором.
 raiserle24 июл. 2018 г., 21:55
Не безопасно, используйте транзакцию на движке InnoDB. Или использоватьLOCK TABLES смотри мой пост:stackoverflow.com/a/51506539/2935383
 joHN06 сент. 2013 г., 06:28
Как это может быть достигнуто в массовой вставке, скажем, INSERT INTO .... SELECT QUERY?
 Martin01 окт. 2010 г., 12:19
Спасибо! Сначала я не работал, так как использовал asp.net с MySQL, и мне нужно было добавить Allow User Variables = True в строку подключения, чтобы разрешить переменные.
 FosAvance28 мар. 2013 г., 17:45
Что если 2 ВСТАВКИ произошли одновременно или один перед другим?
 Angel27 апр. 2017 г., 15:27
Можно ли сохранить переменную @ last_id_in_table1 в переменную php, чтобы использовать ее позже?
 snorbi14 окт. 2016 г., 16:43
Использование MAX () небезопасно вне транзакции (то есть автокоммит включен) и внутри транзакции с уровнем изоляции транзакции ниже сериализуемого. Увидеть:en.wikipedia.org/wiki/Isolation_(database_systems)
 Ben19 окт. 2017 г., 17:14
Вы, вероятно, не должны использоватьLAST_INSERT_ID() послеINSERT IGNORE, Если есть столкновение клавиш, новая строка не будет вставлена ​​иLAST_INSERT_ID() вернет 0.
 Angel27 апр. 2017 г., 15:37
Можно ли сохранить переменную last_id_in_table1 в переменную php, чтобы использовать ее позже? С этим last_id мне нужно прикрепить некоторые записи в другую таблицу с этим last_id, поэтому мне нужно: 1) сделать INSERT и получить INSERT last_id_in_table1 в значениях Table1 (name) («AAA»); SET last_id_in_table1 = LAST_INSERT_ID (); 2) Для любых неопределенных строк в другой таблице, ОБНОВИТЬ эти строки с помощью last_id_insert, сгенерированного во вставке. foreach (элемент как e) {ОБНОВЛЕНИЕ Table2 SET column1 = last_id_in_table1 WHERE id в array ()}
 Momin Al Aziz31 дек. 2013 г., 18:20
@FosAvance LAST_INSERT_ID () зависит от соединенияссылка
 Aidiakapi11 мар. 2013 г., 15:07
@RobStarling Я полностью согласен, но в случае, если это кому-то действительно нужно; используйте транзакцию с надлежащим уровнем изоляции.
 user216616406 июн. 2015 г., 15:50
#Julien Hoarau В чем разница между SET @ last_id_in_table1 = и SET last_id_in_table1 =?

после вашего запроса, последний автоинкрементный идентификатор без другого запроса, вставьте в ваш код:

mysql_insert_id();
 TecBrat21 апр. 2014 г., 20:19
Лука, если ты удалишь этот устаревший ответ, я верю, что твои очки репутации будут возвращены.
 w5m21 нояб. 2014 г., 10:49
Другой допустимой альтернативой устаревшему предложению является PDO :: lastInsertId (php.net/manual/en/pdo.lastinsertid.php)
 German Rumm05 авг. 2013 г., 10:12
Не рекомендую mysql_ * - они устарели
 Maciej Paprocki10 янв. 2014 г., 16:39
Клетус ответил на это в 2009 году! mysql не рекомендуется использовать mysqli и mysqli_insert_idie2.php.net/mysqli_insert_id
 jp2code13 дек. 2013 г., 21:22
Клетус получил 106 голосов и отметил ответ дляmysql_insert_id Вот:stackoverflow.com/a/897361/153923

ой таблице, вы можете получить его оттуда:

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

который вводит записи, поэтому я выполняю следующий запрос сразу после вставки:

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

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

            $id = $row['id'];

}

Это извлекает последний идентификатор из базы данных.

 sspence6531 мар. 2017 г., 22:49
Я должен был привести действительный пример, поэтому я использовал тот, который я использую. Если бы я сделал это в C, вы, вероятно, жаловались бы, что "не каждый использует C" ....

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

который отлично работает :-) Но

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

не работает Потому что после первой команды оболочка выйдет из mysql и снова войдет для второй команды, а затем переменная @last_insert_id больше не будет установлена. Мое решение:

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

Может быть, кто-то ищет решение bash :-)

 raiserle24 июл. 2018 г., 21:31
LAST_INSERT_ID доступно только для активного соединения.#mysq-команда подключения для каждой команды. Вы можете связаться сmysql команду на сервер и вставьте свои запросы, или вы можете создать текстовый файл, и выmysql команда с перенаправлением из текстового файла акаmysql [connection option] < txt.file

вместо LAST_INSERT_ID () в запросе вы можете использовать SELECT MAX (id) FROM table1 ;, но вы должны использовать (),

INSERT INTO table1 (title,userid) VALUES ('test', 1)
INSERT INTO table2 (parentid,otherid,userid) VALUES ( (SELECT MAX(id) FROM table1), 4, 1)
 snorbi14 окт. 2016 г., 16:39
Это решение небезопасно вне транзакции (то есть автокоммит включен) и внутри транзакции с уровнем изоляции транзакции ниже сериализуемого. Увидеть:en.wikipedia.org/wiki/Isolation_(database_systems)

бе таблицы.

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;
 Kurt Van den Branden14 дек. 2016 г., 23:42
Хороший выстрел по сделке.
 raiserle24 июл. 2018 г., 21:29
Но: доступно только на InnoDB.

вы можете использовать процедуру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

И вы можете использовать это ...

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

чтобы использовать ее позже?

С этим last_id мне нужно прикрепить некоторые записи в другую таблицу с этим last_id, поэтому мне нужно:

1) Сделайте INSERT и получите last_id_in_table1

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

2) Для любых неопределенных строк в другой таблице, ОБНОВИТЬ эти строки с помощью last_id_insert, сгенерированного во вставке.

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

Ваш ответ на вопрос