복붙노트

[SQL] `REPLACE`와 MySQL에서 'INSERT ... ON DUPLICATE KEY UPDATE` 사이의 실제적인 차이점은 무엇입니까?

SQL

`REPLACE`와 MySQL에서 'INSERT ... ON DUPLICATE KEY UPDATE` 사이의 실제적인 차이점은 무엇입니까?

내가 필요한 것은 아직 그런 키에 대한 기록이없는 경우 레코드를 삽입, (키가 실제로 복합이다) 특정 키를 가진 레코드의 모든 필드의 값을 설정하는 것입니다.

교체 작업을 수행하는 의미로 보이지만, 동시에 그 매뉴얼 페이지는 제안 INSERT ... ON DUPLICATE KEY UPDATE.

내가 더 잘 무엇을 선택해야하는 이유는?

즉 내 마음에 와서 교체의 유일한 "부작용"(다행히 내가 어떤을 사용하지 않는) INSERT ... ON DUPLICATE KEY UPDATE가 아닐 것이지만 그것은 자동 증가 값을 증가 할 것입니다. 마음에 취할 수있는 다른 실제적인 차이점은 무엇입니까? 특히 어떤 경우에는 반대의 INSERT ... ON DUPLICATE KEY UPDATE 및 그 선호 할 대체 할 수있다?

해결법

  1. ==============================

    1.삭제 후 삽입 내부적으로 수행 교체. 당신이 행에서 외래 키 제약 가리키는 경우이 문제가 발생할 수 있습니다. 외국 키가 삭제 계단식으로 설정되어있는 경우, 다른 테이블에서 행이 삭제됩니다 REPLACE : (가) 실패하거나 악화 수 REPLACE이 상황에서. 이 제약 조건은 이전과 교체 수술 후 모두 충족 된 경우에도 발생할 수 있습니다.

    삭제 후 삽입 내부적으로 수행 교체. 당신이 행에서 외래 키 제약 가리키는 경우이 문제가 발생할 수 있습니다. 외국 키가 삭제 계단식으로 설정되어있는 경우, 다른 테이블에서 행이 삭제됩니다 REPLACE : (가) 실패하거나 악화 수 REPLACE이 상황에서. 이 제약 조건은 이전과 교체 수술 후 모두 충족 된 경우에도 발생할 수 있습니다.

    INSERT를 사용하여 ... ON DUPLICATE KEY UPDATE이 문제를 피할 수 있으므로 바람직하다.

  2. ==============================

    2.성능면에서 질문에 대답하기 위해, 나는 모두에게 방법을 사용하여 테스트를했다

    성능면에서 질문에 대답하기 위해, 나는 모두에게 방법을 사용하여 테스트를했다

    속으로는 포함 바꾸기 : 테이블에 삽입 1.Try 2. 1, 삭제 행과 삽입 새 행에 실패하면 중복 키 업데이트에 삽입 포함한다 : 테이블에 삽입 1.Try 2.If 1, 업데이트 행 실패 관련된 모든 단계를 삽입 인 경우, 성능에 차이가있을 수 없습니다. 속도는 관련 업데이트의 수에 의존한다. 모든 문이 업데이트가 때 최악의 경우입니다

    나는 62,510 항목 (업데이트 만)를 포함하는 내 InnoDB의 테이블에 문을 모두 노력했다. camparing 속도에서 : 속으로 바꾸기 : 77.411 초 중복 키 업데이트에 삽입 : 2.446 초

    Insert on Duplicate Key update is almost 32 times faster.
    

    테이블 크기 : 아마존 m3.medium 12 열 1249250 행

  3. ==============================

    3.대신 INSERT ... ON DUPLICATE KEY UPDATE의 교체 사용하는 경우 여러 쿼리가 주어진 키에 대해 신속하게 도착했을 때, 나는 때때로 키 잠금 또는 교착 상태 문제를 관찰합니다. (캐스케이드 삭제가 발생하지 이외에) 후자의 자성은 사용하기 더욱 이유이다.

    대신 INSERT ... ON DUPLICATE KEY UPDATE의 교체 사용하는 경우 여러 쿼리가 주어진 키에 대해 신속하게 도착했을 때, 나는 때때로 키 잠금 또는 교착 상태 문제를 관찰합니다. (캐스케이드 삭제가 발생하지 이외에) 후자의 자성은 사용하기 더욱 이유이다.

  4. ==============================

    4.난 그냥 오류 1022와 (페더 레이 티드 스토리지 엔진 INSERT있는 테이블의 경우 ... ON DUPLICATE KEY UPDATE 문 허용되는 하드 방법을 찾았지만 실패했습니다 쓸 수 없습니다; 테이블에 중복 키를. ..) 중복 키 위반이 발생하는 경우 - 수동 MySQL을 참조이 페이지에 글 머리 기호를 해당 참조하십시오.

    난 그냥 오류 1022와 (페더 레이 티드 스토리지 엔진 INSERT있는 테이블의 경우 ... ON DUPLICATE KEY UPDATE 문 허용되는 하드 방법을 찾았지만 실패했습니다 쓸 수 없습니다; 테이블에 중복 키를. ..) 중복 키 위반이 발생하는 경우 - 수동 MySQL을 참조이 페이지에 글 머리 기호를 해당 참조하십시오.

    다행히, 나는 FEDERATED 테이블에 대한 변경 사항을 복제의 원하는 결과를 달성하기 위해 트리거 삽입 내 후 내 대신 INSERT ... ON DUPLICATE KEY UPDATE의 교체 사용 할 수 있었다.

  5. ==============================

    5.교체는 키가 이미 존재하는 경우이 작업을 수행 것으로 보인다. 아마도 그 둘 사이의 속도 차이가 의미?

    교체는 키가 이미 존재하는 경우이 작업을 수행 것으로 보인다. 아마도 그 둘 사이의 속도 차이가 의미?

    (INSERT) 하나 개 삭제 + 하나 개 삽입 대 하나의 업데이트 (교체)

    편집 : 느려질 수 있습니다 대체 내 의미는 실제로 완전히 잘못된 것입니다. 음, 어쨌든이 블로그 게시물에 따라 ... http://www.tokutek.com/2010/07/why-insert-on-duplicate-key-update-may-be-slow-by-incurring-disk-seeks /

  6. ==============================

    6.당신은 모든 열을 나열하지 않는 경우, 나는 대체 행에 기본값으로 언급되지 않은 열을 재설정합니다 REPLACE 생각합니다. ON DUPLICATE KEY UPDATE는 변경되지 언급되지 않은 열을 떠날 것이다.

    당신은 모든 열을 나열하지 않는 경우, 나는 대체 행에 기본값으로 언급되지 않은 열을 재설정합니다 REPLACE 생각합니다. ON DUPLICATE KEY UPDATE는 변경되지 언급되지 않은 열을 떠날 것이다.

  7. ==============================

    7."이는 중복 키 에러의 경우, 스토리지 엔진은 오히려 삭제 플러스 인서트보다 업데이트하면 교체 수행 할 가능성이 있지만, 의미는 동일하다. '

    "이는 중복 키 에러의 경우, 스토리지 엔진은 오히려 삭제 플러스 인서트보다 업데이트하면 교체 수행 할 가능성이 있지만, 의미는 동일하다. '

    http://dev.mysql.com/doc/refman/5.7/en/replace.html

  8. ==============================

    8.INSERT는 데이터 변환과 함께 작동하지 않는 것 무시하기 때문에 교체가 필요 때로는 것 같다.

    INSERT는 데이터 변환과 함께 작동하지 않는 것 무시하기 때문에 교체가 필요 때로는 것 같다.

    내가 이렇게하면, 나는 단지 자체에 largestCityPop을 설정합니다 :

    내가 이렇게하면, 내가 잘못 GROUP 기능을 사용하고 있습니다 :

    나는이 작업을 수행한다면, MySQL은 열 이름을 인식하지 않습니다 :

    이것은 작동하지만, 그냥 일반 추한 것 같다 :

  9. from https://stackoverflow.com/questions/9168928/what-are-practical-differences-between-replace-and-insert-on-duplicate-ke by cc-by-sa and MIT license