2011-01-06 3 views
1

다소 큰 InnoDB/MySQL 관계형 데이터베이스가 있습니다. "ON UPDATE CASCADE"(및 "ON DELETE CASCADE")와 결합 된 외래 키 제약 조건을 사방에 사용했습니다.InnoDB/MySQL의 외래 키 조건과 케스케이드로 작업하기

이 데이터베이스는 CRM 시스템의 일부이므로 사용자가 포함되어 있으며 해당 사용자에게 계정이 연결되어 있습니다.

종종 사용자 테이블에 중복 항목이 있고 병합하려고합니다.

하나의 옵션은 모든 종속 테이블에서 user_id 열을 업데이트하는 데이터베이스를 탐색하는 스크립트를 작성하는 것입니다. 그러나 이것은 의심 할 여지없이 데이터베이스 구조가 바뀔 때마다 중단됩니다.

다른 옵션으로는 CASCADE를 사용하고 있습니다.

UPDATE user SET id = $A.id$ WHERE id = $B.id$ limit 1 

그런 다음이 변경은 사용자 테이블에 종속 된 모든 테이블을 통해 전파한다 : 나는 사람 A와 사람 B를 병합 할 경우에, 나는 이런 식으로 뭔가를 할 수 있습니다.

은 그럼 사용자로부터 중복 행 중 하나를 삭제해야합니다 :

DELETE FROM user WHERE id = $A.id$ LIMIT 1 

불행하게도이 방법 두 가지 문제가 있습니다.

첫째, user.id 열이 기본 키이므로 고유합니다.

두 번째로 (사용자가 중복 된 ID를 가지고 있고 기본 인덱스에서 user.id을 일반 INDEX로 변환했다면), 종속 테이블의 모든 행이 삭제됩니다.

이러한 문제를 해결할 수있는 방법이 있습니까?

+0

'user.id 열이 기본 키이고'사용자의 중복 ID '라고 말하면 혼란 스럽습니다. id가 기본 키인 경우 고유하므로 고유 키는 어떻게됩니까? – Mark

+0

예, 죄송합니다. 두 번째 부분에서는'user.id'를 기본 키에서 일반 인덱스로 변환했다고 가정합니다. 편집 됨. – aidan

답변

0

복제 사용자 (또는 anythings 복제)의 병합 문제는 삭제 계단식 및 업데이트 계단식에 대한 신뢰가 아닙니다. 첫 번째로, 충돌이있을 때 보관할 데이터를 어떻게 알 수 있습니까? (예 : 두 개의 다른 집 주소와 한 개의 주소 만 허용됨) Deduping은 고유 한 제약 조건에 부딪 힐 때 우선 순위가 될 값을 선택할 수있는이 목적을 위해 구축 된 응용 프로그램에서 수동으로 수행하는 것이 가장 좋습니다. 수동으로 수행하는 경우 우선 순위 결정 규칙을 결정해야합니다 (일반적으로 가장 최근에 업데이트 된 레코드는 레코드가 마지막으로 업데이트 된 시점을 기록해야 함을 의미합니다). 또한 이렇게 할 때 감사 테이블을 갖고 싶기 때문에 하나가 아닌 "중복"을 실행 취소 할 수 있습니다.