복붙노트

[SQL] 나는 임시 테이블이없는 MySQL의 테이블의 모든 중복 레코드를 삭제하려면 어떻게

SQL

나는 임시 테이블이없는 MySQL의 테이블의 모든 중복 레코드를 삭제하려면 어떻게

나는이에 변화의 숫자를 본 적이 있지만 아무 것도 꽤 내가 달성하기 위해 노력하고있어 일치하지 않습니다.

나는 구성 설문에 사용자에 의해 주어진 답을 포함하는 테이블, TableA의를 가지고있다. 열은 quiz_num, question_num, answer_num, MEMBER_ID된다.

어떻게 든 몇 회원들은 답이 두 번 제출되었다. 그래서 중복 레코드를 제거해야하지만 하나 개의 행이 남아 있는지 확인하십시오.

동일한 데이터를 두 개 또는 세 개의 행이 모두있을 수 있도록 프라이 열이 없습니다.

모든 중복을 제거하는 쿼리가 있습니까?

해결법

  1. ==============================

    1.테이블에 고유 인덱스를 추가 :

    테이블에 고유 인덱스를 추가 :

    ALTER IGNORE TABLE `TableA`   
    ADD UNIQUE INDEX (`member_id`, `quiz_num`, `question_num`, `answer_num`);
    

    이 작업을 수행하는 또 다른 방법은 다음과 같습니다

    당신은 쉽게 다음 쿼리를 사용하여 테이블에서 중복을 제거 할 수 있습니다 다음 테이블에 기본 키를 추가 :

    DELETE FROM member  
    WHERE id IN (SELECT * 
                 FROM (SELECT id FROM member 
                       GROUP BY member_id, quiz_num, question_num, answer_num HAVING (COUNT(*) > 1)
                      ) AS A
                );
    
  2. ==============================

    2.다음 (TAbleA_Verify SELECT * FROM TABLEA에 삽입) TableA_Verify에서 오는 레지스터와 함께 원래의 테이블을 채우는 (TableA의에서 삭제) 대신 드롭 테이블 TableA의, 당신은 모든 레지스터가 삭제할 수 있습니다. 이 방법은 원래 테이블에 대한 모든 참조를 잃지 않았다 (인덱스, ...)

    다음 (TAbleA_Verify SELECT * FROM TABLEA에 삽입) TableA_Verify에서 오는 레지스터와 함께 원래의 테이블을 채우는 (TableA의에서 삭제) 대신 드롭 테이블 TableA의, 당신은 모든 레지스터가 삭제할 수 있습니다. 이 방법은 원래 테이블에 대한 모든 참조를 잃지 않았다 (인덱스, ...)

    CREATE TABLE TableA_Verify AS SELECT DISTINCT * FROM TableA;
    
    DELETE FROM TableA;
    
    INSERT INTO TableA SELECT * FROM TAbleA_Verify;
    
    DROP TABLE TableA_Verify;
    
  3. ==============================

    3.이 TEMP 테이블,하지만 실제 테이블 대신를 사용하지 않습니다. 문제는 단지 임시 테이블에 대해이 아니라 테이블 작성 또는 삭제 테이블에 대한 경우,이 작동합니다 :

    이 TEMP 테이블,하지만 실제 테이블 대신를 사용하지 않습니다. 문제는 단지 임시 테이블에 대해이 아니라 테이블 작성 또는 삭제 테이블에 대한 경우,이 작동합니다 :

    SELECT DISTINCT * INTO TableA_Verify FROM TableA;
    
    DROP TABLE TableA;
    
    RENAME TABLE TableA_Verify TO TableA;
    
  4. ==============================

    4.덕분에 위의 대답을 jveirasv합니다.

    덕분에 위의 대답을 jveirasv합니다.

    당신이 컬럼의 특정 세트의 제거 중복에 필요한 경우 (당신은 예를 들어 달라 테이블의 타임 스탬프가있는 경우), 당신은이를 사용할 수 있습니다

    CREATE TABLE TableA_Verify AS SELECT * FROM TableA WHERE 1 GROUP BY [COLUMN TO remove duplicates BY];
    
    DELETE FROM TableA;
    
    INSERT INTO TableA SELECT * FROM TAbleA_Verify;
    
    DROP TABLE TableA_Verify;
    
  5. ==============================

    5.테이블에 고유 인덱스를 추가 :

    테이블에 고유 인덱스를 추가 :

    ALTER IGNORE TABLE TableA   
    ADD UNIQUE INDEX (member_id, quiz_num, question_num, answer_num);
    

    작업은 매우 잘

  6. ==============================

    6.당신이 어떤 기본 키를 사용하지 않는 경우, 하나의 스트로크에서 다음 쿼리를 실행합니다. 값을 대체하여 :

    당신이 어떤 기본 키를 사용하지 않는 경우, 하나의 스트로크에서 다음 쿼리를 실행합니다. 값을 대체하여 :

    # table_name - Your Table Name
    # column_name_of_duplicates - Name of column where duplicate entries are found
    
    create table table_name_temp like table_name;
    insert into table_name_temp select distinct(column_name_of_duplicates),value,type from table_name group by column_name_of_duplicates;
    delete from table_name;
    insert into table_name select * from table_name_temp;
    drop table table_name_temp
    

    당신이 그것으로 재생하기 전에 데이터베이스의 백업을 수행하는 것이 좋습니다.

  7. ==============================

    7.코멘트에서 언급 한 바와 같이 항목을 두 번 이상 중복되는 경우, Saharsh 샤의 대답에 쿼리를 여러 번 실행해야합니다.

    코멘트에서 언급 한 바와 같이 항목을 두 번 이상 중복되는 경우, Saharsh 샤의 대답에 쿼리를 여러 번 실행해야합니다.

    여기에 '라이브'테이블을 유지하면서 삭제할 중복을 허용, 모든 데이터를 삭제하지 않는 솔루션, 그리고 원래의 테이블에 전체 시간 데이터를 유지 :

    alter table tableA add column duplicate tinyint(1) not null default '0';
    
    update tableA set
    duplicate=if(@member_id=member_id
                 and @quiz_num=quiz_num
                 and @question_num=question_num
                 and @answer_num=answer_num,1,0),
    member_id=(@member_id:=member_id),
    quiz_num=(@quiz_num:=quiz_num),
    question_num=(@question_num:=question_num),
    answer_num=(@answer_num:=answer_num)
    order by member_id, quiz_num, question_num, answer_num;
    
    delete from tableA where duplicate=1;
    
    alter table tableA drop column duplicate;
    

    현재 행이 마지막 행과 같은 경우이 기본적으로 확인합니다,하고 있는지, 중복 등의 표시를 (순서 문 보장하지만 중복은 서로 옆에 표시됩니다). 그럼 당신은 중복 레코드를 삭제합니다. 나는 원래 상태로 가져옵니다 끝에 중복 된 열을 제거합니다.

    곧 멀리 갈 수도도 무시 ALTER 테이블과 같습니다 http://dev.mysql.com/worklog/task/?id=7395

  8. ==============================

    8.또 다른 방법은 같은 구조의 새 임시 테이블을 생성하는 것입니다.

    또 다른 방법은 같은 구조의 새 임시 테이블을 생성하는 것입니다.

    CREATE TABLE temp_table AS SELECT * FROM original_table LIMIT 0
    

    그런 다음 테이블의 기본 키를 만듭니다.

    ALTER TABLE temp_table ADD PRIMARY KEY (primary-key-field)
    

    중복 기록을 무시하고 마지막으로 원래 테이블에서 모든 레코드를 복사합니다.

    INSERT IGNORE INTO temp_table AS SELECT * FROM original_table
    

    이제 원래의 테이블을 삭제하고 새 테이블의 이름을 바꿀 수 있습니다.

    DROP TABLE original_table
    RENAME TABLE temp_table TO original_table
    
  9. from https://stackoverflow.com/questions/14046355/how-do-i-delete-all-the-duplicate-records-in-a-mysql-table-without-temp-tables by cc-by-sa and MIT license