mysql db에서 중복 항목을 제거하는 방법은 무엇입니까?
ID + 제목이 있는 테이블이 있습니다.제목 열을 고유하게 만들고 싶지만 이미 60만 개 이상의 레코드가 있으며, 일부 레코드는 중복됩니다(때로는 수십 배 이상).
하나를 제외한 모든 중복을 제거하여 이후 제목 열에 고유 키를 추가하려면 어떻게 해야 합니까?
이 명령은 고유 키를 추가하고 고유 키로 인해 오류가 발생하는 모든 행을 삭제합니다.이렇게 하면 중복 항목이 제거됩니다.
ALTER IGNORE TABLE table ADD UNIQUE KEY idx1(title);
Edit: 일부 버전의 MySQL에 대한 InnoDB 테이블에는 이 명령이 작동하지 않을 수 있습니다.해결 방법은 이 게시물을 참조하십시오.(이 정보에 대해 "익명 사용자"에게 감사드립니다.)
원래 테이블의 고유한 행만 사용하여 새 테이블을 만듭니다.다른 방법도 있겠지만 저는 이것이 가장 깨끗하다고 생각합니다.
CREATE TABLE tmp_table AS SELECT DISTINCT [....] FROM main_table
더 구체적으로 말하면:
더 빠른 방법은 개별 행을 임시 테이블에 삽입하는 것입니다.delete를 사용하여 8백만 행의 테이블에서 중복 항목을 제거하는 데 몇 시간이 걸렸습니다.삽입과 구별을 사용하여 13분밖에 걸리지 않았습니다.
CREATE TABLE tempTableName LIKE tableName;
CREATE INDEX ix_all_id ON tableName(cellId,attributeId,entityRowId,value);
INSERT INTO tempTableName(cellId,attributeId,entityRowId,value) SELECT DISTINCT cellId,attributeId,entityRowId,value FROM tableName;
DROP TABLE tableName;
INSERT tableName SELECT * FROM tempTableName;
DROP TABLE tempTableName;
MySql » ALTER IGNORE TABLE
더 이상 사용되지 않습니다. 인덱스를 추가하기 전에 중복 날짜를 실제로 삭제해야 합니다.
먼저 모든 중복 항목을 찾는 쿼리를 작성합니다.서 저는 여서제생엔각기▁that엔라고 가정합니다.email
중복 항목을 포함하는 필드입니다.
SELECT
s1.email
s1.id,
s1.created
s2.id,
s2.created
FROM
student AS s1
INNER JOIN
student AS s2
WHERE
/* Emails are the same */
s1.email = s2.email AND
/* DON'T select both accounts,
only select the one created later.
The serial id could also be used here */
s2.created > s1.created
;
다음은 고유한 중복 ID만 선택합니다.
SELECT
DISTINCT s2.id
FROM
student AS s1
INNER JOIN
student AS s2
WHERE
s1.email = s2.email AND
s2.created > s1.created
;
삭제할 중복 ID만 포함되어 있으면 삭제를 실행합니다.당신은 야합다니해를 .(SELECT * FROM tblname)
MySql이 불평하지 않도록.
DELETE FROM
student
WHERE
id
IN (
SELECT
DISTINCT s2.id
FROM
(SELECT * FROM student) AS s1
INNER JOIN
(SELECT * FROM student) AS s2
WHERE
s1.email = s2.email AND
s2.created > s1.created
);
그런 다음 고유 인덱스를 만듭니다.
ALTER TABLE
student
ADD UNIQUE INDEX
idx_student_unique_email(email)
;
아래 쿼리를 사용하여 "id" 필드 값이 가장 낮은 행 하나를 제외한 모든 중복 항목을 삭제할 수 있습니다.
DELETE t1 FROM table_name t1, table_name t2 WHERE t1.id > t2.id AND t1.name = t2.name
마찬가지로 다음과 같이 행을 'id'에서 가장 높은 값으로 유지할 수 있습니다.
DELETE t1 FROM table_name t1, table_name t2 WHERE t1.id < t2.id AND t1.name = t2.name
여기에서는 SQL2000에서 이 작업을 수행하는 방법을 보여 줍니다.MySQL 구문에 완전히 익숙하지는 않지만 비슷한 것이 있다고 확신합니다.
create table #titles (iid int identity (1, 1), title varchar(200))
-- Repeat this step many times to create duplicates
insert into #titles(title) values ('bob')
insert into #titles(title) values ('bob1')
insert into #titles(title) values ('bob2')
insert into #titles(title) values ('bob3')
insert into #titles(title) values ('bob4')
DELETE T FROM
#titles T left join
(
select title, min(iid) as minid from #titles group by title
) D on T.title = D.title and T.iid = D.minid
WHERE D.minid is null
Select * FROM #titles
delete from student where id in (
SELECT distinct(s1.`student_id`) from student as s1 inner join student as s2
where s1.`sex` = s2.`sex` and
s1.`student_id` > s2.`student_id` and
s1.`sex` = 'M'
ORDER BY `s1`.`student_id` ASC
)
Nitin이 올린 솔루션이 가장 우아하고 논리적인 솔루션인 것 같습니다.
그러나 한 가지 문제가 있습니다.
오류 1093(HY000):FROM 절에서 업데이트 대상 테이블 'student'를 지정할 수 없습니다.
그러나 학생 대신 (SELECT * FROM 학생)을 사용하면 이 문제를 해결할 수 있습니다.
DELETE FROM student WHERE id IN (
SELECT distinct(s1.`student_id`) FROM (SELECT * FROM student) AS s1 INNER JOIN (SELECT * FROM student) AS s2
WHERE s1.`sex` = s2.`sex` AND
s1.`student_id` > s2.`student_id` AND
s1.`sex` = 'M'
ORDER BY `s1`.`student_id` ASC
)
원래 해결책을 생각해 낸 니틴에게 +1을 주세요.
MySQL 테이블에서 중복 항목을 삭제하는 것은 일반적으로 특정 요구 사항과 함께 발생하는 일반적인 문제입니다.관심 있는 사람이 있을 경우를 위해 여기(MySQL에서 중복 행 제거) 임시 테이블을 사용하여 MySQL 중복을 신뢰할 수 있고 빠른 방법으로 삭제하는 방법을 설명합니다(다른 사용 사례의 예 포함).
이 경우 다음과 같은 방법이 사용될 것입니다.
-- create a new temporary table
CREATE TABLE tmp_table1 LIKE table1;
-- add a unique constraint
ALTER TABLE tmp_table1 ADD UNIQUE(id, title);
-- scan over the table to insert entries
INSERT IGNORE INTO tmp_table1 SELECT * FROM table1 ORDER BY sid;
-- rename tables
RENAME TABLE table1 TO backup_table1, tmp_table1 TO table1;
언급URL : https://stackoverflow.com/questions/2867530/how-to-remove-duplicate-entries-from-a-mysql-db
'programing' 카테고리의 다른 글
아이폰에서 방향 변경 시 웹 앱의 스케일/줌을 재설정하려면 어떻게 해야 합니까? (0) | 2023.09.08 |
---|---|
POST JSON with MVC 4 API Controller (0) | 2023.09.08 |
jquery는 자바스크립트 라이브러리입니까, 아니면 프레임워크입니까? (0) | 2023.09.03 |
scanf()를 사용하여 여러 값 가져오기 (0) | 2023.09.03 |
Spring Boot에서 특정 URL 패턴에 대한 CSRF 보호 사용 안 함 (0) | 2023.09.03 |