mysql 삽입 쿼리에서 새 레코드 기본 키 ID를 가져 오시겠습니까?


249

좋아, 그래서 MySQL의를하고있는 중이 야 말할 수 INSERT내 테이블 중 하나에 테이블이 컬럼이 item_id설정되어 autoincrementprimary key.

item_id동일한 쿼리에서 새로 생성 된 기본 키의 값을 출력하도록 쿼리를 얻으려면 어떻게해야 합니까?

현재 ID를 검색하기 위해 두 번째 쿼리를 실행하고 있지만 이것이 잘못된 결과를 초래할 수 있다는 점을 고려하면 좋은 습관처럼 보이지 않습니다 ...

이것이 가능하지 않은 경우 올바른 ID를 검색하도록하는 가장 좋은 방법은 무엇입니까?


1
INSERT그런 쿼리 에서 아무것도 반환 할 수있는 방법이 없습니다 . 왜 잘못된 결과를 낳을 수 있다고 생각합니까?
폭발 환약

4
글쎄, 프로세스가 두 사람에 의해 별도로 실행되면 겹치는 프로세스 목록을 얻을 수 있습니다 .2 개의 별도 쿼리를 실행해야합니까?
Amy Neville


@JimFell 네, 기본적으로 같은 질문이지만,이 질문은 일반적으로 훨씬 더 나은 답변을 가지고 있습니다
RozzA

1
postgresql을 사용 하고이 INSERT INTO 테이블 (col1, col2) VALUES (val1, val2) RETURNING id 또는 INSERT INTO 테이블 (col1, col2) VALUES (val1, val2) RETURNING * 또는 UPDATE 테이블 SET col1 = val1, col2 = val2 WHERE 문 RETURNING id 또는 UPDATE 테이블 SET (col1, col2) = (val1, val2) WHERE 문 RETURNING id 또는 UPDATE 테이블 SET (col1, col2) = (val1, val2) WHERE 문 RETURNING *
gdarcan

답변:


327

다음 LAST_INSERT_ID()기능 을 사용해야합니다 . http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id

예 :

INSERT INTO table_name (col1, col2,...) VALUES ('val1', 'val2'...);
SELECT LAST_INSERT_ID();

이것은 당신이 다시 얻을 PRIMARY KEY것을 마지막 행의 값 삽입을 :

생성 된 ID는 연결별로 서버에서 유지 보수 됩니다 . 이는 함수에 의해 주어진 클라이언트에 반환 된 값이 해당 클라이언트의 AUTO_INCREMENT 열에 영향을 미치는 가장 최근의 명령문에 대해 생성 된 첫 번째 AUTO_INCREMENT 값 임을 의미 합니다.

따라서 반환 된 값 LAST_INSERT_ID()은 사용자 당 값 이며 다른 사용자 의 서버 에서 실행될 수있는 다른 쿼리의 영향을받지 않습니다 .


8
예. 프로세스 목록의 쿼리 사이에 중간에 다른 행이 삽입 된 경우 어떻게됩니까? 삽입 쿼리를 작성하여 출력하도록 방법이 있습니까?
Amy Neville

알다시피 ... 결과에 기록되지 않은 경우에도 쿼리의 마지막 삽입 ID가 기록됩니다 ... $ mysqli-> insert_id
Amy Neville

27
이것은 당신이 다시 얻을 PRIMARY KEY것을 마지막 행의 값 서버에 각 연결은이에 대한 자신의 가치의 유지 -이 연결 당이기 때문에, 삽입을. 이를 명확히하기 위해 답변을 업데이트했습니다.
Duncan Lock

따라서 3 명의 사용자가 동시에 양식을 게시하고 내 데이터베이스에 입력해야한다고 가정하십시오. table2에서 새로 작성된 각 table1 ID에 해당하는 행을 추가하고 싶습니다. 들어오는 데이터베이스 쓰기 요청에 대해 동시성이 처리됩니까? 아니면 PHP에서 수동으로 수행해야합니까?
bad_keypoints

table1 삽입을 수행하는 시점에서 데이터베이스가 table2에 삽입하려는 모든 정보를 알고있는 경우 트리거를 사용하여이를 수행하거나이를 쿼리로 결합 할 수 있습니다. 그렇지 않은 경우 여러 쿼리를 사용해야합니다 (예 : PHP에서 수행). 데이터가 무엇이며 두 번째 인서트의 위치에 따라 다릅니다.
Duncan Lock

21

조심해 !! PHP 내에서이 기본 키 값을 반환하려는 경우 "LAST_INSERT_ID ()"

이 스레드에 php 태그가 없다는 것을 알고 있지만이 답변을 발견 한 사람은 표준 mysql_query 호출을 사용하여 PHP 스크립트 삽입에서 MySQL 삽입 ID를 반환하려고합니다. 작동하지 않으며 SQL 오류를 캡처하지 않으면 명확하지 않습니다.

최신 mysqli는 여러 쿼리를 지원합니다. LAST_INSERT_ID ()는 실제로 원본의 두 번째 쿼리입니다.

IMO 마지막 기본 키를 식별하기위한 별도의 SELECT는 선택적인 mysql_insert_id () 함수보다 안전하여 이전 INSERT 작업에서 생성 된 AUTO_INCREMENT ID를 반환합니다.


7
LAST_INSERT_ID연결 별 MySQL 함수입니다. 마지막 삽입 ID를 쿼리하면 별도의 연결에서 쓰기를 수행했을 수 있으며 잘못된 ID를 갖게됩니다.
폭발 약

@ExplosionPills는 mysql_insert_id()또한 연결 단위로 작동하지만, 여기와 같이 이상한 행동을 앓고 stackoverflow.com/a/897374/1305910 Cliffordlife에 의해 코멘트에를 - 신경 끄시 고 우리는 사용하고 있어야합니다mysqli
RozzA

'작동하지 않을 때'라는 의미를 명확하게 설명 할 수 있습니까?
john ktejik

18

로부터 LAST_INSERT_ID()문서 :

생성 된 ID는 연결별로 서버에서 유지 보수 됩니다.

즉, 스크립트에 대한 두 개의 별도 요청이 동시에 있으면 서로 영향을 미치지 않습니다 (아직 LAST_INSERT_ID()영구 연결을 사용하지 않는 한).


2
테이블에 다른 테이블에 삽입하는 트리거가있는 경우에는 의심 스럽다고 생각합니다 .... LAST_INSERT_ID ()는 다른 테이블의 id 값을 반환합니다.
bgies

15

당신이 찾고있는 것!

select LAST_INSERT_ID()

이것은 SCOPE_IDENTITY()에서 사용되는 기능 의 가장 좋은 대안입니다 SQL Server.

또한 쿼리에 Last_INSERT_ID()따라 실행되는 경우에만 작동한다는 점을 명심 해야 Insert합니다. 즉, 쿼리는 스키마에 삽입 된 ID를 반환합니다. 특정 테이블의 마지막 삽입 ID를 얻을 수 없습니다.

자세한 내용 은 mySQL의 SQLServer 함수 SCOPE_IDENTITY ()와 동일합니까?


6

행을 삽입하기 전에 값이 필요한 경우 :

CREATE FUNCTION `getAutoincrementalNextVal`(`TableName` VARCHAR(50))
    RETURNS BIGINT
    LANGUAGE SQL
    NOT DETERMINISTIC
    CONTAINS SQL
    SQL SECURITY DEFINER
    COMMENT ''
BEGIN

    DECLARE Value BIGINT;

    SELECT
        AUTO_INCREMENT INTO Value
    FROM
        information_schema.tables
    WHERE
        table_name = TableName AND
        table_schema = DATABASE();

    RETURN Value;

END

이것을 인서트에 사용할 수 있습니다 :

INSERT INTO
    document (Code, Title, Body)
VALUES (                
    sha1( concat (convert ( now() , char), ' ',   getAutoincrementalNextval ('document') ) ),
    'Title',
    'Body'
);

1
이것은 좋은 생각이 아닌 것 같습니다? 2 명의 클라이언트가 동시에 그 기능을 호출하면 실제로는 그렇지 않을 때 동일한 ID를 삽입한다고 생각할 것입니다. 하나는 삽입에서 약간 느려지고 모르게 다음 ID를 얻습니다.
CarCar

5

쿼리 결과에 다음 매개 변수가 수신됩니다.

    "fieldCount": 0,
    "affectedRows": 1,
    "insertId": 66,
    "serverStatus": 2,
    "warningCount": 1,
    "message": "",
    "protocol41": true,
    "changedRows": 0

insertId당신이 필요로 정확히입니다.

(NodeJS-mySql)


4

Python에서 pymysql을 사용하는 경우 커서에서 cursor를 사용할 수 있습니다.


2

"$ last_id = mysqli_insert_id ($ conn);"을 사용하십시오.


2
나는 실제로 구글 덕분 에이 답변의 PHP 버전을 찾고 여기에서 우연히 만났 으므로이 답변에 투표했습니다. 기술적으로 OP는 PHP를 요구하지 않지만, 이것은 여기를 우연히 발견하는 많은 사람들에게 도움이 될 수 있습니다.
사진 작가 Britt

매우 감사합니다 Arnav! I
JuanSedano 16:21에



0

PHP에서 이것에 대한 접근 방식을 공유하고 싶습니다. 일부 사용자는 효율적인 방법을 찾지 못했지만 다른 사용 가능한 옵션보다 100 낫습니다.

임의의 키를 생성하고 테이블에 삽입하여 새 행을 작성하십시오. 그런 다음 해당 키를 사용하여 기본 키를 검색 할 수 있습니다. 업데이트를 사용하여 데이터를 추가하고 다른 작업을 수행하십시오.

이 방법을 사용하면 행을 보호하고 올바른 기본 키를 확보하는 데 도움이됩니다.

다른 옵션이 없으면 정말로 권장하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.