다소 큰 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로 변환했다면), 종속 테이블의 모든 행이 삭제됩니다.
이러한 문제를 해결할 수있는 방법이 있습니까?
'user.id 열이 기본 키이고'사용자의 중복 ID '라고 말하면 혼란 스럽습니다. id가 기본 키인 경우 고유하므로 고유 키는 어떻게됩니까? – Mark
예, 죄송합니다. 두 번째 부분에서는'user.id'를 기본 키에서 일반 인덱스로 변환했다고 가정합니다. 편집 됨. – aidan