[SQL] 나는 임시 테이블이없는 MySQL의 테이블의 모든 중복 레코드를 삭제하려면 어떻게
SQL나는 임시 테이블이없는 MySQL의 테이블의 모든 중복 레코드를 삭제하려면 어떻게
나는이에 변화의 숫자를 본 적이 있지만 아무 것도 꽤 내가 달성하기 위해 노력하고있어 일치하지 않습니다.
나는 구성 설문에 사용자에 의해 주어진 답을 포함하는 테이블, TableA의를 가지고있다. 열은 quiz_num, question_num, answer_num, MEMBER_ID된다.
어떻게 든 몇 회원들은 답이 두 번 제출되었다. 그래서 중복 레코드를 제거해야하지만 하나 개의 행이 남아 있는지 확인하십시오.
동일한 데이터를 두 개 또는 세 개의 행이 모두있을 수 있도록 프라이 열이 없습니다.
모든 중복을 제거하는 쿼리가 있습니까?
해결법
-
==============================
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.다음 (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.이 TEMP 테이블,하지만 실제 테이블 대신를 사용하지 않습니다. 문제는 단지 임시 테이블에 대해이 아니라 테이블 작성 또는 삭제 테이블에 대한 경우,이 작동합니다 :
이 TEMP 테이블,하지만 실제 테이블 대신를 사용하지 않습니다. 문제는 단지 임시 테이블에 대해이 아니라 테이블 작성 또는 삭제 테이블에 대한 경우,이 작동합니다 :
SELECT DISTINCT * INTO TableA_Verify FROM TableA; DROP TABLE TableA; RENAME TABLE TableA_Verify TO TableA;
-
==============================
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.테이블에 고유 인덱스를 추가 :
테이블에 고유 인덱스를 추가 :
ALTER IGNORE TABLE TableA ADD UNIQUE INDEX (member_id, quiz_num, question_num, answer_num);
작업은 매우 잘
-
==============================
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.코멘트에서 언급 한 바와 같이 항목을 두 번 이상 중복되는 경우, 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.또 다른 방법은 같은 구조의 새 임시 테이블을 생성하는 것입니다.
또 다른 방법은 같은 구조의 새 임시 테이블을 생성하는 것입니다.
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
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
'SQL' 카테고리의 다른 글
[SQL] 열 등의 SQL 트랜스 행 (0) | 2020.04.14 |
---|---|
[SQL] sp_reset_connection은 무엇입니까? (0) | 2020.04.14 |
[SQL] 어떻게 여러 레코드를 삽입하고 ID 값을 얻을 수 있습니까? (0) | 2020.04.14 |
[SQL] MySQL은 비교 날짜 (0) | 2020.04.14 |
[SQL] SQLite는 무작위 행 (들)을 선택 (0) | 2020.04.14 |