복붙노트

[SQL] MySQL의에서 중복 행을 제거

SQL

MySQL의에서 중복 행을 제거

나는 다음과 같은 필드가있는 테이블이 있습니다 :

id (Unique)
url (Unique)
title
company
site_id

지금, 나는 동일한 제목, 회사와 사이트 ID를 가진 행을 제거해야합니다. 이 스크립트 (PHP)과 함께 다음과 같은 SQL을 사용하는 것 한 가지 방법 :

SELECT title, site_id, location, id, count( * ) 
FROM jobs
GROUP BY site_id, company, title, location
HAVING count( * ) >1

이 쿼리를 실행 한 후, 나는 서버 측 스크립트를 사용하여 중복을 제거 할 수 있습니다.

그러나, 나는이 SQL 쿼리를 사용하는 경우에만 수행 할 수 있는지 알고 싶습니다.

해결법

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

    1.이 작업을 수행하는 정말 쉬운 방법은 3 열에서 UNIQUE 인덱스를 추가하는 것입니다. 당신은 ALTER 문을 쓸 때, 키워드 무시 있습니다. 그래서 같이 :

    이 작업을 수행하는 정말 쉬운 방법은 3 열에서 UNIQUE 인덱스를 추가하는 것입니다. 당신은 ALTER 문을 쓸 때, 키워드 무시 있습니다. 그래서 같이 :

    ALTER IGNORE TABLE jobs
    ADD UNIQUE INDEX idx_name (site_id, title, company);
    

    이 모든 중복 행을 삭제합니다. 추가 혜택으로 중복되어 미래의 인서트는 밖으로 오류 것이다. 언제나처럼, 당신은 이런 식으로 뭔가를 실행하기 전에 백업을 수행 할 수 있습니다 ...

  2. ==============================

    2.당신이 열 속성을 변경하지 않으려면, 당신은 아래의 쿼리를 사용할 수 있습니다.

    당신이 열 속성을 변경하지 않으려면, 당신은 아래의 쿼리를 사용할 수 있습니다.

    당신이 고유 ID (예를 들어, AUTO_INCREMENT 컬럼)가 열을 가지고 있기 때문에, 당신은 중복을 제거하는 데 사용할 수 있습니다 :

    DELETE `a`
    FROM
        `jobs` AS `a`,
        `jobs` AS `b`
    WHERE
        -- IMPORTANT: Ensures one version remains
        -- Change "ID" to your unique column's name
        `a`.`ID` < `b`.`ID`
    
        -- Any duplicates you want to check for
        AND (`a`.`title` = `b`.`title` OR `a`.`title` IS NULL AND `b`.`title` IS NULL)
        AND (`a`.`company` = `b`.`company` OR `a`.`company` IS NULL AND `b`.`company` IS NULL)
        AND (`a`.`site_id` = `b`.`site_id` OR `a`.`site_id` IS NULL AND `b`.`site_id` IS NULL);
    

    MySQL은, 당신은 NULL 안전 동등 연산자 (일명 "우주선 운영자")로 더욱를 단순화 할 수 있습니다 :

    DELETE `a`
    FROM
        `jobs` AS `a`,
        `jobs` AS `b`
    WHERE
        -- IMPORTANT: Ensures one version remains
        -- Change "ID" to your unique column's name
        `a`.`ID` < `b`.`ID`
    
        -- Any duplicates you want to check for
        AND `a`.`title` <=> `b`.`title`
        AND `a`.`company` <=> `b`.`company`
        AND `a`.`site_id` <=> `b`.`site_id`;
    
  3. ==============================

    3.MySQL은 당신이에서 삭제하는 표를 참조에 대한 제한이 있습니다. 당신은 같은 임시 테이블과 그 주위에 작업 할 수 있습니다 :

    MySQL은 당신이에서 삭제하는 표를 참조에 대한 제한이 있습니다. 당신은 같은 임시 테이블과 그 주위에 작업 할 수 있습니다 :

    create temporary table tmpTable (id int);
    
    insert  into tmpTable
            (id)
    select  id
    from    YourTable yt
    where   exists
            (
            select  *
            from    YourTabe yt2
            where   yt2.title = yt.title
                    and yt2.company = yt.company
                    and yt2.site_id = yt.site_id
                    and yt2.id > yt.id
            );
    
    delete  
    from    YourTable
    where   ID in (select id from tmpTable);
    

    코멘트에 Kostanos '제안에서 : 유일한 슬로우 쿼리는 위의 매우 큰 데이터베이스가있는 경우에, DELETE입니다. 이 쿼리는 빠를 수 :

    DELETE FROM YourTable USING YourTable, tmpTable WHERE YourTable.id=tmpTable.id
    
  4. ==============================

    4.(가) 문 내 경우처럼 작동하지 않습니다 무시하면, 당신은 문 아래를 사용할 수 있습니다 :

    (가) 문 내 경우처럼 작동하지 않습니다 무시하면, 당신은 문 아래를 사용할 수 있습니다 :

    CREATE TABLE your_table_deduped like your_table;
    INSERT your_table_deduped SELECT * FROM your_table GROUP BY index1_id, index2_id;
    RENAME TABLE your_table TO your_table_with_dupes;
    RENAME TABLE your_table_deduped TO your_table;
    #OPTIONAL
    ALTER TABLE `your_table` ADD UNIQUE `unique_index` (`index1_id`, `index2_id`);
    #OPTIONAL
    DROP TABLE your_table_with_dupes;
    
  5. ==============================

    5.MySQL의 테이블에서 중복을 삭제하면 genarally 손 전에 해당 중복을 피하기 위해 누락 된 제약의 결과의 일반적인 문제입니다. 그러나이 일반적인 문제는 일반적으로 수행되는 특정 접근이 필요한 특정 요구 ...와 함께 제공됩니다. 접근 방식은에, 예를 들어, 데이터의 크기, 인덱스가 있는지, (첫 번째 또는 마지막 일반적으로) 유지되어야 중복 된 항목이 유지 될 따라 달라야한다, 또는 우리는 추가를 수행 할 것인지 여부 복제 된 데이터에 대한 조치.

    MySQL의 테이블에서 중복을 삭제하면 genarally 손 전에 해당 중복을 피하기 위해 누락 된 제약의 결과의 일반적인 문제입니다. 그러나이 일반적인 문제는 일반적으로 수행되는 특정 접근이 필요한 특정 요구 ...와 함께 제공됩니다. 접근 방식은에, 예를 들어, 데이터의 크기, 인덱스가 있는지, (첫 번째 또는 마지막 일반적으로) 유지되어야 중복 된 항목이 유지 될 따라 달라야한다, 또는 우리는 추가를 수행 할 것인지 여부 복제 된 데이터에 대한 조치.

    이러한 테이블의 UPDATE를 수행 할 때 원인에서에서 같은 테이블을 참조 할 수없는 등의 MySQL 자체에 약간의 특이성이도 있습니다 (이것은 MySQL의 오류 # 1093을 올릴 수 있습니다). 이 제한은 (일부는 위의 접근에 제안) 임시 테이블과 내부 쿼리를 사용하여 극복 될 수있다. 빅 데이터 소스를 처리 할 때하지만이 내부 쿼리는 특별히 잘 수행하지 않습니다.

    그러나, 더 좋은 방법은 효율적이고 신뢰할 수있는 모두의 제거 중복 존재를 수행하고, 그 쉽게 다양한 요구에 적용 할 수 있습니다.

    일반적인 개념은 일반적으로 고유 제한 조건 추가 중복을 피하기 위해, 그리고 중복 처리를하면서, 새로 이전 테이블에서 데이터를 삽입을 추가, 새로운 임시 테이블을 만드는 것입니다. 이 방법은 간단한 MySQL의 INSERT 쿼리에 의존하는 추가 중복을 피하기 위해 새로운 제약 조건을 생성하고, 중복 및 (따라서 너무 큰 데이터 소스를 피팅) 메모리에 보관해야합니다 임시 테이블을 검색하는 내부 쿼리를 사용의 필요성을 건너 뜁니다.

    이것은 달성 할 수있는 방법입니다. 우리는 다음과 같은 열이 테이블의 직원을 감안할 때 :

    employee (id, first_name, last_name, start_date, ssn)
    

    중복 SSN 컬럼과 행을 삭제하기 위해, 그리고 유지의 첫 번째 항목은 다음과 같은 과정이 올 수 있습니다 발견 :

    -- create a new tmp_eployee table
    CREATE TABLE tmp_employee LIKE employee;
    
    -- add a unique constraint
    ALTER TABLE tmp_employee ADD UNIQUE(ssn);
    
    -- scan over the employee table to insert employee entries
    INSERT IGNORE INTO tmp_employee SELECT * FROM employee ORDER BY id;
    
    -- rename tables
    RENAME TABLE employee TO backup_employee, tmp_employee TO employee;
    

    ⇒이 방법을 사용 1.6M 레지스터는 200S 미만 6K로 변환되었다.

    Chetan에, 실행하여 UNIQUE 제약 조건을 모든 중복을 제거하고 생성, 당신은 할 수 빠르고 쉽게이 과정을 다음과 같은 :

    CREATE TABLE tmp_jobs LIKE jobs;
    
    ALTER TABLE tmp_jobs ADD UNIQUE(site_id, title, company);
    
    INSERT IGNORE INTO tmp_jobs SELECT * FROM jobs ORDER BY id;
    
    RENAME TABLE jobs TO backup_jobs, tmp_jobs TO jobs;
    

    물론,이 과정은 더욱 중복을 삭제할 때 다른 요구에 적응할 수정할 수 있습니다. 몇 가지 예 따릅니다.

    때때로 우리는 대신 첫 번째의 마지막 중복 항목을 유지해야합니다.

    CREATE TABLE tmp_employee LIKE employee;
    
    ALTER TABLE tmp_employee ADD UNIQUE(ssn);
    
    INSERT IGNORE INTO tmp_employee SELECT * FROM employee ORDER BY id DESC;
    
    RENAME TABLE employee TO backup_employee, tmp_employee TO employee;
    

    때때로 우리는 (예 : 중복의 수를 유지로) 발견되는 중복 항목에 대한 몇 가지 추가 처리를 수행해야합니다.

    CREATE TABLE tmp_employee LIKE employee;
    
    ALTER TABLE tmp_employee ADD UNIQUE(ssn);
    
    ALTER TABLE tmp_employee ADD COLUMN n_duplicates INT DEFAULT 0;
    
    INSERT INTO tmp_employee SELECT * FROM employee ORDER BY id ON DUPLICATE KEY UPDATE n_duplicates=n_duplicates+1;
    
    RENAME TABLE employee TO backup_employee, tmp_employee TO employee;
    

    때때로 우리는 위해 가능한 소형으로 인덱스를 유지, 자동 증가 필드를 사용하고, 우리는 새로운 임시 테이블에 자동 증분 필드를 재생하기 위해 중복의 삭제를 활용할 수 있습니다.

    CREATE TABLE tmp_employee LIKE employee;
    
    ALTER TABLE tmp_employee ADD UNIQUE(ssn);
    
    INSERT IGNORE INTO tmp_employee SELECT (first_name, last_name, start_date, ssn) FROM employee ORDER BY id;
    
    RENAME TABLE employee TO backup_employee, tmp_employee TO employee;
    

    많은 추가 수정은 원하는 동작에 따라도 행할 수있다. 예를 들어, 다음 쿼리는 1) 외에에 제 2 임시 테이블을 사용하는 대신 첫 번째의 마지막 항목을 유지합니다; 및 2)에있는 중복 카운터를 증가; 이 전자 데이터에 있다는 항목 순서를 유지하면서도 3) 자동 증분 필드 ID를 재생성.

    CREATE TABLE tmp_employee LIKE employee;
    
    ALTER TABLE tmp_employee ADD UNIQUE(ssn);
    
    ALTER TABLE tmp_employee ADD COLUMN n_duplicates INT DEFAULT 0;
    
    INSERT INTO tmp_employee SELECT * FROM employee ORDER BY id DESC ON DUPLICATE KEY UPDATE n_duplicates=n_duplicates+1;
    
    CREATE TABLE tmp_employee2 LIKE tmp_employee;
    
    INSERT INTO tmp_employee2 SELECT (first_name, last_name, start_date, ssn) FROM tmp_employee ORDER BY id;
    
    DROP TABLE tmp_employee;
    
    RENAME TABLE employee TO backup_employee, tmp_employee2 TO employee;
    
  6. ==============================

    6.다른 해결책이있다 :

    다른 해결책이있다 :

    DELETE t1 FROM my_table t1, my_table t2 WHERE t1.id < t2.id AND t1.my_field = t2.my_field AND t1.my_field_2 = t2.my_field_2 AND ...
    
  7. ==============================

    7.당신이 기록의 큰 숫자 다음 위의와 큰 테이블이있는 경우 솔루션이 작동 또는 너무 많은 시간이 소요되지 않습니다. 그런 다음 우리는 다른 해결책을 가지고

    당신이 기록의 큰 숫자 다음 위의와 큰 테이블이있는 경우 솔루션이 작동 또는 너무 많은 시간이 소요되지 않습니다. 그런 다음 우리는 다른 해결책을 가지고

    -- Create temporary table
    
    CREATE TABLE temp_table LIKE table1;
    
    -- Add constraint
    ALTER TABLE temp_table ADD UNIQUE(title, company,site_id);
    
    -- Copy data
    INSERT IGNORE INTO temp_table SELECT * FROM table1;
    
    -- Rename and drop
    RENAME TABLE table1 TO old_table1, temp_table TO table1;
    DROP TABLE old_table1;
    
  8. ==============================

    8.나는 SQL Server에 대한이 쿼리 조각을 가지고 있지만 그것은 작은 변화가 다른 사람의 DBMS에서 사용할 수있는 생각 :

    나는 SQL Server에 대한이 쿼리 조각을 가지고 있지만 그것은 작은 변화가 다른 사람의 DBMS에서 사용할 수있는 생각 :

    DELETE
    FROM Table
    WHERE Table.idTable IN  (  
        SELECT MAX(idTable)
        FROM idTable
        GROUP BY field1, field2, field3
        HAVING COUNT(*) > 1)
    

    나는이 쿼리는 중복 행의 가장 낮은 ID로 행을 제거하지 않는 당신에게 잊어 버렸습니다. 당신을 위해이 작품이 쿼리를 시도 할 경우 :

    DELETE
    FROM jobs
    WHERE jobs.id IN  (  
        SELECT MAX(id)
        FROM jobs
        GROUP BY site_id, company, title, location
        HAVING COUNT(*) > 1)
    
  9. ==============================

    9.빠른 방법은 임시 테이블에 별개의 행을 삽입하는 것입니다. 삭제 사용하여, 8 백만 행의 테이블에서 중복을 제거하기 위해 나에게 약간의 시간이 걸렸다. 삽입과 별개를 사용하여, 그것은 단지 13분했다.

    빠른 방법은 임시 테이블에 별개의 행을 삽입하는 것입니다. 삭제 사용하여, 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;  
    TRUNCATE TABLE tableName;
    INSERT INTO tableName SELECT * FROM tempTableName; 
    DROP TABLE tempTableName;  
    
  10. ==============================

    10.나는 간단한 방법을 발견했다. (최신 유지)

    나는 간단한 방법을 발견했다. (최신 유지)

    DELETE t1 FROM tablename t1 INNER JOIN tablename t2 
    WHERE t1.id < t2.id AND t1.column1 = t2.column1 AND t1.column2 = t2.column2;
    
  11. ==============================

    11.모든 경우를위한 간단하고 빠른 :

    모든 경우를위한 간단하고 빠른 :

    CREATE TEMPORARY TABLE IF NOT EXISTS _temp_duplicates AS (SELECT dub.id FROM table_with_duplications dub GROUP BY dub.field_must_be_uniq_1, dub.field_must_be_uniq_2 HAVING COUNT(*)  > 1);
    
    DELETE FROM table_with_duplications WHERE id IN (SELECT id FROM _temp_duplicates);
    
  12. ==============================

    12.DELETE 사용하여 삭제 중복 행은 문을 가입 MySQL은 빠르게 중복 행을 제거하는 데 사용할 수있는 DELETE 가입 문을 제공합니다.

    DELETE 사용하여 삭제 중복 행은 문을 가입 MySQL은 빠르게 중복 행을 제거하는 데 사용할 수있는 DELETE 가입 문을 제공합니다.

    다음 문은 중복 행을 삭제하고 가장 높은 ID를 유지한다 :

    DELETE t1 FROM contacts t1
        INNER JOIN
    contacts t2 WHERE
    t1.id < t2.id AND t1.email = t2.email;
    
  13. ==============================

    13.나는 내가 이노 MySQL의 테이블을 가지고 있기 때문에 내가 "제거 중복 MySQL의 양식"하지만 내 theIGNORE을위한 솔루션이 일을하지 않는 구글이 페이지를 언제든지 방문 계속

    나는 내가 이노 MySQL의 테이블을 가지고 있기 때문에 내가 "제거 중복 MySQL의 양식"하지만 내 theIGNORE을위한 솔루션이 일을하지 않는 구글이 페이지를 언제든지 방문 계속

    이 코드는 더 나은 언제 작동

    CREATE TABLE tableToclean_temp LIKE tableToclean;
    ALTER TABLE tableToclean_temp ADD UNIQUE INDEX (fontsinuse_id);
    INSERT IGNORE INTO tableToclean_temp SELECT * FROM tableToclean;
    DROP TABLE tableToclean;
    RENAME TABLE tableToclean_temp TO tableToclean;
    

    tableToclean 당신이 청소해야 할 테이블의 이름을 =

    tableToclean_temp 생성 및 삭제 임시 테이블을 =

  14. ==============================

    14.이해하기 간단하고 기본 키와 함께 작동하는 솔루션 :

    이해하기 간단하고 기본 키와 함께 작동하는 솔루션 :

    1) 새로운 항목을 추가 부울

    alter table mytable add tokeep boolean;
    

    2) 중복 된 열 및 새로운 열 제약 조건을 추가

    alter table mytable add constraint preventdupe unique (mycol1, mycol2, tokeep);
    

    3) 참 부울 열 세트. 이것은 단지 때문에 새로운 제약의 중복 행 중 하나에 성공

    update ignore mytable set tokeep = true;
    

    4) tokeep으로 표시되지 않은 삭제 행

    delete from mytable where tokeep is null;
    

    5) 추가 열을 삭제

    alter table mytable drop tokeep;
    

    난 당신이 새로운 중복이 미래에 방지 그래서, 당신이 추가 한 제약 조건을 유지하는 것이 좋습니다.

  15. ==============================

    15.이것은 나를 위해 작동합니다 :

    이것은 나를 위해 작동합니다 :

    DELETE t1 FROM tablename t1
    INNER JOIN tablename t2 
    WHERE 
        t1.id < t2.id AND
        t1.title = t2.title AND
        t1.company=t2.company AND
        t1.site_ID=t2.site_ID;
    
  16. ==============================

    16.이 솔루션은 다른으로 하나 개의 테이블에 중복과 유니크 이동합니다.

    이 솔루션은 다른으로 하나 개의 테이블에 중복과 유니크 이동합니다.

    -- speed up creating uniques table if dealing with many rows
    CREATE INDEX temp_idx ON jobs(site_id, company, title, location);
    
    -- create the table with unique rows
    INSERT jobs_uniques SELECT * FROM
        (
        SELECT * 
        FROM jobs
        GROUP BY site_id, company, title, location
        HAVING count(1) > 1
        UNION
        SELECT *
        FROM jobs
        GROUP BY site_id, company, title, location
        HAVING count(1) = 1
    ) x
    
    -- create the table with duplicate rows
    INSERT jobs_dupes 
    SELECT * 
    FROM jobs
    WHERE id NOT IN
    (SELECT id FROM jobs_uniques)
    
    -- confirm the difference between uniques and dupes tables
    SELECT COUNT(1)
    AS jobs, 
    (SELECT COUNT(1) FROM jobs_dupes) + (SELECT COUNT(1) FROM jobs_uniques)
    AS sum
    FROM jobs
    
  17. ==============================

    17.버전 8.0 (2018)로, MySQL은 마침내 윈도우 기능을 지원합니다.

    버전 8.0 (2018)로, MySQL은 마침내 윈도우 기능을 지원합니다.

    윈도우 함수는 편리하고 효율적인 상표입니다. 다음은이 과제를 해결하기 위해 그들을 사용하는 방법을 보여주는 솔루션입니다.

    하위 쿼리에서는 ID로 주문 1 열 / 2 열 그룹 내 테이블에서 각 레코드에 위치를 지정 ROW_NUMBER ()를 사용할 수 있습니다. 더 중복이없는 경우 중복이있는 경우, 레코드가 행 번호 1을 얻을 것이다, 그들은 ID (1부터 시작)를 오름차순으로 번호가됩니다.

    기록이 제대로 하위 쿼리에 번호가되면, 외부 쿼리는 그 행 번호 1이 아닌 모든 레코드를 삭제합니다.

    검색어 :

    DELETE FROM tablename
    WHERE id IN (
        SELECT id
        FROM (
            SELECT 
                id, 
                ROW_NUMBER() OVER(PARTITION BY column1, column2 ORDER BY id) rn
            FROM output
        ) t
        WHERE rn > 1
    )
    
  18. ==============================

    18.테이블에 중복 레코드를 삭제합니다.

    테이블에 중복 레코드를 삭제합니다.

    delete from job s 
    where rowid < any 
    (select rowid from job k 
    where s.site_id = k.site_id and 
    s.title = k.title and 
    s.company = k.company);
    

    또는

    delete from job s 
    where rowid not in 
    (select max(rowid) from job k 
    where s.site_id = k.site_id and
    s.title = k.title and 
    s.company = k.company);
    
  19. ==============================

    19.

    -- Here is what I used, and it works:
    create table temp_table like my_table;
    -- t_id is my unique column
    insert into temp_table (id) select id from my_table GROUP by t_id;
    delete from my_table where id not in (select id from temp_table);
    drop table temp_table;
    
  20. ==============================

    20.주문에서 독특한 열, 예를 들어, 레코드를 복제 COL1, COL2는, COL3 복제 할 안 (테이블에되었습니다 우리는 테이블 구조 및 다수의 중복 된 항목의 고유 한 3 열을 놓친 가정)

    주문에서 독특한 열, 예를 들어, 레코드를 복제 COL1, COL2는, COL3 복제 할 안 (테이블에되었습니다 우리는 테이블 구조 및 다수의 중복 된 항목의 고유 한 3 열을 놓친 가정)

    DROP TABLE TABLE_NAME_copy;
    CREATE TABLE TABLE_NAME_copy LIKE TABLE_NAME;
    INSERT INTO TABLE_NAME_copy
    SELECT * FROM TABLE_NAME
    GROUP BY COLUMN1, COLUMN2, COLUMN3; 
    DROP TABLE TABLE_NAME;
    ALTER TABLE TABLE_NAME_copy RENAME TO TABLE_NAME;
    

    희망은 dev에 도움이 될 것입니다.

  21. ==============================

    21.이 문제를 해결하기 위해 크게 설명한 튜토리얼은 mysqltutorial.org 사이트에서 찾을 수 있습니다 :

    이 문제를 해결하기 위해 크게 설명한 튜토리얼은 mysqltutorial.org 사이트에서 찾을 수 있습니다 :

    MySQL의에서 중복 행을 삭제하는 방법

    매우 명확하게 세 가지 방법으로 중복 행을 삭제하는 방법을 표시됩니다 :

    DELETE 사용 A)는 문을 가입

    중간 테이블을 사용한 B)

    C) ROW_NUMBER 사용 () 함수

    나는 누군가를 도울 수 있기를 바랍니다.

  22. ==============================

    22.나는 그래서 여기 삭제 내 솔루션 기록으로되는 좀 더 구체적으로 좋아한다 :

    나는 그래서 여기 삭제 내 솔루션 기록으로되는 좀 더 구체적으로 좋아한다 :

    delete
    from jobs c1
    where not c1.location = 'Paris'
    and  c1.site_id > 64218
    and exists 
    (  
    select * from jobs c2 
    where c2.site_id = c1.site_id
    and   c2.company = c1.company
    and   c2.location = c1.location
    and   c2.title = c1.title
    and   c2.site_id > 63412
    and   c2.site_id < 64219
    )
    
  23. ==============================

    23.당신은 쉽게이 코드에서 중복 레코드를 삭제할 수 있습니다 ..

    당신은 쉽게이 코드에서 중복 레코드를 삭제할 수 있습니다 ..

    $qry = mysql_query("SELECT * from cities");
    while($qry_row = mysql_fetch_array($qry))
    {
    $qry2 = mysql_query("SELECT * from cities2 where city = '".$qry_row['city']."'");
    
    if(mysql_num_rows($qry2) > 1){
        while($row = mysql_fetch_array($qry2)){
            $city_arry[] = $row;
    
            }
    
        $total = sizeof($city_arry) - 1;
            for($i=1; $i<=$total; $i++){
    
    
                mysql_query( "delete from cities2 where town_id = '".$city_arry[$i][0]."'");
    
                }
        }
        //exit;
    }
    
  24. ==============================

    24.나는 텍스트 필드에이 작업을 수행했다 인덱스에 100 바이트의 한계를 가로 질러왔다.

    나는 텍스트 필드에이 작업을 수행했다 인덱스에 100 바이트의 한계를 가로 질러왔다.

    I는 열 추가 필드의 MD5 해시를 수행하고 바꾼다을 수행하여이를 해결했다.

    ALTER TABLE table ADD `merged` VARCHAR( 40 ) NOT NULL ;
    UPDATE TABLE SET merged` = MD5(CONCAT(`col1`, `col2`, `col3`))
    ALTER IGNORE TABLE table ADD UNIQUE INDEX idx_name (`merged`);
    
  25. from https://stackoverflow.com/questions/3311903/remove-duplicate-rows-in-mysql by cc-by-sa and MIT license