Вопрос

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

Как вы можете понять текущий код просто вернется последнее ID вставки таблицы2 вместо Table1, как я могу получить идентификатор от Table1, даже если я вставляю в Table2 между?

Это было полезно?

Решение

Вы можете хранить последний идентификатор вставки в переменной:

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

Или получить максимальный 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;   

Другие советы

Поскольку вы на самом деле сохранили предыдущий last_insert_id () во вторую таблицу, вы можете получить его оттуда:

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

Это позволяет вставить строку в 2 различных таблицах и создает ссылку на обе оба таблицах.

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;

У меня была та же проблема в Bash, и я делаю что-то подобное:

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

Не работай. Поскольку после первой команды Shell будет выходить из 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 :-)

Было бы возможно сохранить переменную last_id_in_table1 в вариабе php, чтобы использовать ее позже?

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

1) Сделайте вставку и получите файл last_id_in_table1

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

2) Для любых неопределенных строк в другой таблице обновляют эти строки с генерируемым в IST_ID_INSTERT.

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

Для решения NoDB NoDB: вы можете использовать процедуру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;

Для последнего и второго последнего:

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

Просто добавить для post rodrigo, вместо fast_insert_id () в запросе вы можете использовать Select Max (ID) из Table1;, но вы должны использовать (),

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

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

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

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

            $id = $row['id'];

}

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

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

mysql_insert_id();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top