programing

mysql db에서 중복 항목을 제거하는 방법은 무엇입니까?

linuxpc 2023. 9. 3. 12:14
반응형

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

반응형