2008-10-31 5 views
2

테이블에는 ID, 이름 및 개수라는 ​​세 개의 열이 있습니다. 이름 열의 수가 많으면 (초기에 UNIQUE가 부족하기 때문에)이 문제를 해결하고 싶습니다. 그러나 ID 열은 다른 (4 또는 5, 나는 생각한다 - 나는 문서를 점검해야한다) 테이블을 사용하여 이름을 찾고 그냥 제거하면 테이블이 손상 될 수있다. "모든 동일한 레코드를 찾아서 함께 병합하십시오"라고 말하는 좋은 방법이 있습니까?MySQL에서 중복 된 항목을 정리하는 깨끗한 방법이 있습니까?

답변

4

이런 종류의 질문이 수시로 등장과 같은 일을 할 수 없습니다. 아니, 할 수있는 정말 깨끗한 방법이 없습니다. 상위 테이블의 원하지 않는 값을 사용하는 하위 테이블의 모든 행을 변경해야 상위 테이블에서 원하지 않는 행을 제거 할 수 있습니다.

MySQL은 다중 테이블 UPDATEDELETE 문을 지원하기 추천하고 그래서 당신이 할 수있는 꽤 깔끔한 트릭 (데이터베이스의 다른 브랜드와는 달리) 다음

UPDATE names n1 
    JOIN names n2 ON (n1.id < n2.id AND n1.name = n2.name) 
    JOIN child_table c ON (n2.id = c.id) 
SET c.name_id = n1.id 
ORDER BY n1.id DESC; 

은 모든 자식 테이블에 이런 짓을하면 (s)를 사용하면 MySQL의 다중 테이블 DELETE 구문을 사용하여 상위 테이블에서 불필요한 행을 제거 할 수 있습니다.

DELETE FROM n2 
    USING names n1 JOIN names n2 ON (n1.id < n2.id AND n1.name = n2.name); 
0

update dependent_table set name_id = <id you want to keep> where name_id in (
    select id from names where name = 'foo' and id != <id you want to keep>) 
관련 문제