2009-09-29 3 views
4

MySQL에서 행이 이미 테이블에 존재하면 UPDATE를 수행하는 효율적인 방법을 찾으려고합니다. 행에 ' 존재하지 않습니다.행이 존재하는지 여부에 따라 UPDATE 또는 INSERT 수행하기

지금까지 두 가지 방법을 발견했습니다

  1. 명백한 하나 존재하는 경우가 존재 또는 UPDATE하지 않는 경우 INSERT, 행이 존재 하는지를 찾는 SELECT 트랜잭션을 열고, 커밋 트랜잭션
  2. 제 INSERT부터, 제 2 방법은, 트랜잭션을 회피

업데이트 (로우가 이미 존재하는 경우이므로 오류가 발생되지 않는다) 테이블에 무시한다.

어느 것이 더 효율적이라고 생각합니까? 더 좋은 방법이 있습니까 (예 : 트리거 사용)?

+2

나는 이것을 Upserting이라고 불렀습니다. 나는 그것이 그것을위한 아주 간결한 용어 인 것을 알았다. 그리고 웬일인지 그것은 나를 킥킥 웃게한다. –

+0

@MikeTwo도 나에게 낄낄 거리며, 아마도 'upskirt처럼 들린다. :) – nawfal

답변

11
+0

필드의 일부가 일치하거나 키/고유 필드 만 중복되는 경우 업데이트를 수행합니까? – user97410

+0

고유/기본 키 색인의 항목을 일치시킬 때만 활성화됩니다. –

+0

awesomeness indeed – user97410

3

또한 미만 1 인 경우 다음에 일치하는 행을 찾을 수 없습니다, 영향을받는 행의 수를 확인, 업데이트를 수행하므로 INSERT를 perfom 수 있습니다. mysql에서

2

는 당신이 그것을 어떻게 원하는 것을 더 많거나 적은, 내가 생각하는 REPLACE 문이있다.

1

당신이 많이하고 있다면, 그것은 파일을 작성하고 다른 방법이

3

'LOAD DATA INFILE ... REPLACE ...'을 사용할 가치가있다 - REPLACE은. 테이블에있는 오래 된 행은 PRIMARY KEY 또는 UNIQUE 인덱스에 대한 새 행 값이 같다면, 이전 행이 새 행하기 전에 삭제 된 것을 제외하고

REPLACE INTO myTable (col1) VALUES (value1) 

, 정확히 INSERT 같은 작품을 교체 삽입됩니다. See Section 12.2.5, “INSERT Syntax”.

2

REPLACE INTO 그것은 교체라도 삽입위한 UNIQUE INDEX를 사용하는 솔루션이 될 것이다.

REPLACE INTO 
    yourTable 
SET 
    column = value; 

REPLACE은 말 그대로입니다, 이것은 당신이 기대하는 것과 다르게 작동 양해하여 주시기 바랍니다. 그것은 첫째 점검합니다 INSERT을 방지 것 UNIQUE INDEX 충돌이있는 경우, 그것은 충돌 ( DELETE) 모든 행을 제거하고 INSERT 당신이 그것을 준 행이야. (가 발생하지 결코 업데이트를 확인하기 때문에) 트리거가 발사되지 않았거나 (당신이 모든 값을 지정해야하기 때문에) 값은 기본값으로 되돌아처럼

는, 예를 들어, 미묘한 문제로 이어집니다.

관련 문제