LAST_INSERT_ID () MySQL


151

꽤 쉬운 MySQL 질문이 있습니다. 다음 MySql 쿼리를 실행할 때 table1에서 LAST INSERTED ID를 반환해야합니다.

INSERT INTO table1 (title,userid) VALUES ('test',1); 
INSERT INTO table2 (parentid,otherid,userid) VALUES (LAST_INSERT_ID(),4,1);
SELECT LAST_INSERT_ID();

현재 코드가 table1 대신 table2의 LAST INSERT ID를 반환한다는 것을 이해할 수 있으므로 사이에 table2에 삽입하더라도 어떻게 table1에서 id를 얻을 수 있습니까?

답변:


248

마지막 삽입 ID를 변수에 저장할 수 있습니다.

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 테이블을 얻습니다.

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;   

5
감사! MySQL에서 asp.net을 사용하면서 변수를 허용하기 위해 사용자 변수 허용 = 연결 문자열에 연결 문자열을 추가해야하기 때문에 처음에는 작동하지 않았습니다.
Martin

114
다른 삽입 기와의 경쟁에서 벗어날 수 있기 때문에 max는 좋은 생각이 아닙니다.
Rob Starling

5
@RobStarling 나는 전적으로 동의하지만, 누군가가 절대적으로 그것을 필요로하는 경우; 적절한 격리 수준의 트랜잭션을 사용하십시오.
Aidiakapi

8
2 개의 인서트가 동시에 또는 한 번에 발생하면 어떻게됩니까?
FosAvance

32
@FosAvance LAST_INSERT_ID ()는 연결의 특정이다 REF
Gun2sh

18

실제로 이전 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();

13

이를 통해 두 개의 다른 테이블에 행을 삽입하고 두 테이블 모두에 대한 참조를 작성할 수 있습니다.

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;

1
거래에 좋은 기회.
Kurt Van den Branden

1
그러나 InnoDB에서만 사용할 수 있습니다.
raiserle

4

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

작동하지 않습니다. 첫 번째 명령 후에 쉘은 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_INSERT_ID활성 연결에서만 사용할 수 있습니다. #mysq-command 모든 명령에 연결합니다. 당신이 연결할 수있는 mysql서버에 명령 및 쿼리를 삽입하거나 텍스트 파일을 만들 수 있으며, 당신에게 mysqltxt 파일 일명에서 리디렉션과 명령mysql [connection option] < txt.file
raiserle

1

레코드를 입력하는 사람은 한 명뿐이므로 삽입 직후에 다음 쿼리를 실행합니다.

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

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

            $id = $row['id'];

}

데이터베이스에서 마지막 ID를 검색합니다.


1
올바른 예를 제시해야했기 때문에 사용하는 예를 사용했습니다. 내가 C로 해냈다면 아마 "모든 사람이 C를 사용하지는 않는다"고 불평했을 것이다. ...
sspence65

아마 가장 안전하고 가장 간단합니다.)
Anjana Silva

1

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;

0

last_id_in_table1 변수를 PHP 변수에 저장하여 나중에 사용할 수 있습니까?

이 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 
    }


-1

마지막 두 번째 마지막 :

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

이 솔루션은 트랜잭션 외부 (예 : 자동 커밋 가능) 및 트랜잭션 격리 수준이 직렬화 가능 미만인 트랜잭션 내부에서는 안전하지 않습니다. 참조 : en.wikipedia.org/wiki/Isolation_(database_systems)
snorbi

-2

쿼리에서 LAST_INSERT_ID () 대신 Rodrigo post를 추가하기 위해 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)

이 솔루션은 트랜잭션 외부 (예 : 자동 커밋 가능) 및 트랜잭션 격리 수준이 직렬화 가능 미만인 트랜잭션 내부에서는 안전하지 않습니다. 참조 : en.wikipedia.org/wiki/Isolation_(database_systems)
snorbi

-9

mysql에서 가져와야 할 경우 쿼리 후 다른 쿼리가없는 마지막 자동 증분 ID를 코드에 넣으십시오.

mysql_insert_id();

15
mysql_ *를 추천하지 말라-그것들은 더 이상 사용되지 않는다
German Rumm

cletus 는 106 upvotes를 얻었고 여기 mysql_insert_id에 대한 답변을 표시 했습니다 : stackoverflow.com/a/897361/153923
jp2code

2
클레 투스는 2009 년에 그것을 마비시켰다! MySQL은과 mysqli_insert_id mysqli를 사용하는 것이 더 이상 사용되지 않습니다 ie2.php.net/mysqli_insert_id
마치에이 Paprocki

2
루카,이 오래된 답변을 삭제하면 평판 포인트가 반환 될 것입니다.
TecBrat

더 이상 사용되지 않는 제안에 대한 또 다른 유효한 대안은 PDO :: lastInsertId ( php.net/manual/en/pdo.lastinsertid.php )
w5m
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.