programing

여러 레코드 INSERT 문에 사용되는 MySQL LAST_INSERT_ID()

stoneblock 2023. 7. 23. 13:57

여러 레코드 INSERT 문에 사용되는 MySQL LAST_INSERT_ID()

단일 레코드 삽입을 실행하는 루프가 있는 레코드를 여러 개 삽입하면 반환되는 마지막 삽입 ID가 예상대로 마지막 삽입 ID가 됩니다.하지만 제가 여러 개의 레코드를 삽입하면 다음과 같이 됩니다.

INSERT INTO people (name,age)
VALUES ('William',25), ('Bart',15), ('Mary',12);

위의 세 가지가 표에 삽입된 첫 번째 레코드라고 가정해 보겠습니다.insert 문 이후에 마지막 insert id가 3을 반환할 것으로 예상했는데 1을 반환했습니다.문제의 문에 대한 첫 번째 삽입 ID입니다.

그래서 누가 이것이 정상적인 행동인지 확인해 줄 수 있습니까?LAST_INSERT_ID()여러 레코드의 컨텍스트에서 INSERT 문을 사용합니다.그래서 코드를 기반으로 할 수 있습니다.

네. 이 행동은.last_insert_id()는 MySQL 문서에 나와 있습니다.

중요한
단일 문을 사용하여 여러 행을 삽입하는 경우에는 첫 번째로 삽입된 행에 대해서만 생성된 값을 반환합니다.그 이유는 다른 서버에 대해 동일한 문을 쉽게 복제할 수 있도록 하기 위해서입니다.

이 동작은 MySQL의 man 페이지에 언급되어 있습니다.댓글에 있지만 도전을 받지 않아서 예상되는 행동인 것 같습니다.

당신의 테이블에 고유한 자동증분열(ID)이 있고 mysql 자체에서 반품을 요구하지 않는다면 가능하다고 생각합니다.저는 당신에게 DB 요청 3건과 약간의 처리 비용이 더 들 것입니다.다음 단계가 필요합니다.

  1. 삽입하기 바로 전에 "MAX(ID) 이전"을 확인하십시오.
    SELECT MAX(id) AS before_max_id FROM table_name`
  1. 다중 INSERT 만들기...값()은 데이터를 쿼리하여 유지합니다.

    INSERT INTO table_name
    (col1, col2)
    VALUES 
    ("value1-1" , "value1-2"), 
    ("value2-1" , "value2-2"), 
    ("value3-1" , "value3-2"), 
    ON DUPLICATE KEY UPDATE
    
  2. 삽입 후 바로 "After MAX(ID)"를 표시합니다.

    SELECT MAX(id) AS after_max_id FROM table_name`
    
  3. 다음을 포함하여 "Before MAX(ID)"와 "After MAX(ID)" 사이의 ID를 가진 레코드를 가져옵니다.

    SELECT * FROM table_name WHERE id>$before_max_id AND id<=$after_max_id`
    
  4. 검색된 데이터와 일치하도록 삽입한 데이터를 검사하고 사용자가 삽입하지 않은 레코드를 제거합니다.나머지 레코드에는 사용자 ID가 있습니다.

    foreach ($after_collection as $after_item) {
      foreach ($input_collection as $input_item) {
        if ( $after_item->compare_content($input_item) ) {
          $intersection_array[] = $after_item;
        }
      }
    }

이것이 일반인들이 코드의 일부를 가지고 현실 세계에서 그것을 해결하는 방법입니다.자동 증가 덕분에 확인할 수 있는 레코드의 양이 최소화되므로 많은 처리가 필요하지 않습니다.이것은 최종 "복사 & 페이스트" 코드가 아닙니다. 예를 들어, 필요에 따라 compare_content() 함수를 직접 만들어야 합니다.

언급URL : https://stackoverflow.com/questions/4637367/mysql-last-insert-id-used-with-multiple-records-insert-statement