2011-10-27 5 views
2

테이블에서 중복 된 데이터를 찾아 삭제해야하지만 삭제할 레코드의 ID 레코드를 보관하고 'deleted_ids'필드에 추가해야합니다.중복 된 SQL 삭제 - 삭제 된 ID 유지

예를 들어, 여기에 테이블의 일부 내가 현재 가지고 :

+--------+-------------------------------------------------------+ 
| Id  | Name             | 
+--------+-------------------------------------------------------+ 
| 9627 | John Smith           | 
| 9657 | John Smith           | 
| 24455 | John Smith           | 
| 67435 | John Smith           | 
+--------+-------------------------------------------------------+ 

내가 달성하고 싶은 결과 것은 :

+--------+-----------------------------+-------------------------+ 
| Id  | Name      | Deleted_Ids    | 
+--------+-----------------------------+-------------------------+ 
| 9627 | John Smith     | 9657,24455,67435  | 
+--------+-----------------------------+-------------------------+ 

나는 경우, 어떤 실용적인 접근에 열려있어 누구나 솔루션을 제공하거나 제안 해 주시면 감사하겠습니다.

감사합니다, 폴

+0

삭제 된 항목의 목록은 무엇이 필요합니까? "물리적 삭제"대신 "논리적 삭제"사용을 고려 했습니까? –

답변

2

이 경우 계속 진행하려면 여기를 클릭하십시오.
한 거래 내에서 모두 을 수행하십시오.
'John Smith'의 항목이 이미 tbl_del에있는 경우 삭제 된 ID를 추가하려면 UPDATE을 확인해야합니다.

BEGIN; 

INSERT INTO tbl_del 
SELECT name, GROUP_CONCAT(id) AS deleted 
FROM tbl_live 
WHERE name = 'John Smith' 
GROUP BY 1; 

DELETE FROM tbl_live 
WHERE name = 'John Smith'; 

COMMIT; 

하지만 Veseliq에는 유익한 포인트가 있다고 생각합니다.

4

다른 열이하지 마 - 쉼표, 그것을하지 느낌이 좋지 않습니다 구분 된 목록으로 ID를 저장?

최상의 두 번째 테이블 PrimaryUserId 및 DeletedUserId가있는 것입니다. PrimaryUserId는 "9627"입니다. 예를 들어, 실제로 유지하는 레코드 중 하나는 사용자가 삭제 한 모든 복제에 대해 행을 추가하는 것입니다. 메인 테이블. 이 방법을 사용하면 중복 항목이 삭제 된시기를 알고있는 열을 저장할 수도 있습니다.

+0

나는 그것에 대해 생각해 볼만한 해결책이 있다면 그것을 생각할 것입니다. 유일한 문제는 200mm 행을 처리하고 있으며 deleted_ids에 거의 액세스 할 수 없다는 것입니다. 따라서 쉼표로 구분 된 접근 방식은 저장상의 이유로 적합합니다. –

+0

@Paul : 좋습니다. 이 방법에 대한 Erwin의 트랜잭션을 수정할 수 있습니다. –

+0

저장 용량의 차이가 최소화됩니다. –

1

기본적인 접근 방식은 먼저 삭제 기준을 자격이, 이전 테이블에서 모든 행을 선택 할 수 있습니다 -> 새로운 테이블에이 행을 삽입 -> 은 이전 테이블

INSERT INTO new_table 
SELECT id,name FROM old_table WHERE id > 
(
    SELECT min(id) FROM old_table B 
    WHERE A.name = B.name 
); 

delete FROM old_table WHERE id > 
(
    SELECT min(id) FROM old_table B 
    WHERE A.name = B.name 
); 

당신이 할 수있는 모든 행을 삭제 새 테이블에서 자동으로 키가 증가했습니다. 나는이 쿼리를 실행하지 않았으며, 여기에 약간의 오류가 있다면 사유로 생각합니다. 이 두 테이블에 일대일 관계를 갖는 것이 미래에 유용 할 수 있으며 .... 데이터를 쉽게 쿼리 할 수 ​​있습니다.

+0

통지하지 않았습니다. 대답이 받아 들여졌다. – Zohaib