2016-08-05 2 views
0

값을 삽입하고 싶습니다. "duplicate update on duplicate update"가 있으면 업데이트하지만 새롭게 삽입 된 값으로 autoincrement val을 업데이트하지 않습니다. 중복 업데이트에 항상 새로운 ID를 생성하고 그것이 있으면 삭제하지만 정확히이 삭제 된 ID를 얻고 싶습니다. (last_inserted_id를 사용하면 새로 삽입 된 것이 아닌 업데이트 된 컬럼의 마지막 ID를 반환합니다.) 새로운 삽입 된 쿼리로 ID를 업데이트하려면 다음과 같이 작동해야합니다. insert if exists delete 하나가 존재하고 새 증분을 삽입합니다 (자동 증분과 함께). 나는 거기에 대체되지만 너무 느리고 새로운 ID로 업데이트하는 ID 만 원합니다. .duplicate update에 삽입

+0

두 단계로 수행하십시오. 선의의'delete'와'insert'가 필요합니다. 그것은 중복 키 업데이트가 아닙니다. –

+0

@ GordonLinoff하지만 삽입 및 삭제도 삽입보다 느리다는 소식을 들었습니다 ... 중복 업데이트 –

+0

@GordonLinoff를 삭제 한 다음 다른 방법으로 삽입해야합니까? 새 ID로 새 값만 업데이트해야합니다. –

답변

0

자동 증가 열이 포함 된 고급 업데이트 논리를 수행하려고하면 불의합니다.

업데이트 할 때 행에 새 자동 증가 ID가 필요한 경우 이전 행을 삭제하고 고든이 설명한 것처럼 새 행을 삽입하십시오.

insert on duplicate key update을 사용하는 것보다 약간 느릴 수있는 일부 데이터베이스 작업 부하에서는. 그러나 귀하의 테이블에 최소 100 메가 노가 포함되어 있지 않거나 하루 종일 밤새 이러한 작업을 10 회 이상하지 않으면 성능 차이는 거의 없습니다. 그러한 종류의 데이터베이스 크기 또는 작업 부하가있는 경우 데이터베이스 관리자에게 자문을 구하십시오.

REPLACE = DELETE이면 INSERT입니다. IODKU는 절대로 삭제하지 않습니다. 각각의 키를 사용하려면 어떤 UNIQUE 키의 열을 지정해야만 사용할 행을 알 수 있습니다. 미묘한 점 : UNIQUE 키가 여러 개있는 경우 REPLACE은 여러 행을 삭제 한 다음 하나만 삽입 할 수 있습니다.

IODKU는 ... UPDATE id = LAST_INSERT_ID(id), ...을 사용하여 ID (기존 또는 신규)를 가져올 수 있습니다.

+0

Ok 나는이 작업을 수행 할 것이지만 복제본의 어떤 경우가 삭제 및 삽입보다 느린 지 알고 싶습니다. –

+0

'REPLACE'는 더 많은 작업을해야하기 때문에 항상 느려질 수 있습니다. 나는 그 대답에 더 많은 정보를 추가했다. –

+0

당신은 LAST_INSERTED_ID "INSERT ... duplicate update"에 의해 생성 된 ID로 마지막으로 ID를 업데이트하려고하지만, 업데이트 된 elem (이전 ID)의 ID 자체를주었습니다. –