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

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

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

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

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



답변

다음 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()은 사용자 당 값 이며 다른 사용자 의 서버 에서 실행될 수있는 다른 쿼리의 영향을받지 않습니다 .


답변

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

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

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

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


답변

로부터 LAST_INSERT_ID()문서 :

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

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


답변

당신이 찾고있는 것!

select LAST_INSERT_ID()

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

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

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


답변

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

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


답변

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

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

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

(NodeJS-mySql)


답변

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