2010-08-03 4 views
2

외래 키 관계가 이미 해당 행에 설정되어있는 경우 MySQL 테이블에서 중복 행을 삭제할 수 있습니까?
복제본을 어떻게 든 병합 한 다음 외래 키를 새 값으로 업데이트 할 수 있습니까?MySQL 테이블에서 중복 행을 삭제하지만 외래 키 관계가 존재합니까?

+0

기본 키를 제외하고 * 중복되는 행입니까? – egrunin

+0

네, 테이블에서 제거 할 기본 키와 다른 하나의 컬럼을 제외하고는 그렇습니다. – chustar

답변

2

외래 키는 다음 테이블 customers와 테이블 ordersALTER TABLE orders ADD FOREIGN KEY customer_id REFERENCES customers (id) ON DELETE CASCADE 같은 외래 키가있는 경우 또한, 예를 들어, 종속 행을 삭제합니다 중복 행을 삭제 ON DELETE CASCADE, 경우, 고객을 삭제하면 삭제됩니다 그 고객의 주문. 마찬가지로 외래 키가 ON DELETE SET NULL 인 경우 주문은 삭제되지 않지만 해당 customer_id 값은 NULL로 설정됩니다.

원하는 동작이 아니면 외래 키 열을 변경하여 유지하려는 행을 참조하도록 외래 키 충돌을 해결하는 쿼리를 작성하십시오 (즉, 비 중복 고객을 참조하도록 모든 주문을 업데이트하십시오), 불쾌한 행을 삭제하십시오.

또 다른 대안은 외래 키 검사를 일시적으로 사용하지 않도록 설정하는 것이지만 일치하지 않는 데이터베이스가 남게되므로 권장하지 않습니다.

+0

ON DELETE SET NULL을 사용하여 복제본에 연결된 외부 키 열을 모두 NULL로 설정 한 다음 스크립트에서 직접 위의 ID로 업데이트 할 수 있습니까? – chustar

+1

"바로 위에"올바른 SQL 구문이 아닙니다. SQL 데이터베이스의 레코드는 데이터 테이블에서 그 이전 또는 이후에 있었던 것을 알지 못합니다. "before"와 "after"는 연산자에 의해 부과됩니다 ('sort asc'와'sort desc'의 차이로 생각하십시오). –

+1

임시 테이블을 사용하여 삭제하려는 행과 유지하려는 해당 행 사이의 관계를 저장할 수 있습니다. CREATE TABLE customer_duplicates (duplicate_id, original_id);와 FK를 중복 및 원래 고객에게 제공합니다. 어떤 고객을 유지할 것인지, 어떤 고객을 복제 할 것인지 결정하고 이에 따라 복제 테이블을 채우십시오. 그런 다음 주문 테이블을 업데이트하여 중복 고객을 참조하는 모든 주문이 이제 원래 고객을 참조하도록합니다. 마지막으로 중복 고객을 제거하고 중복 테이블을 삭제하십시오. – tdammers