source

MySQL: ALTER IGNORE TABLE이 "Integrity 제약 조건 위반"을 발생시킵니다.

goodcode 2023. 1. 19. 21:29
반응형

MySQL: ALTER IGNORE TABLE이 "Integrity 제약 조건 위반"을 발생시킵니다.

ALTER IGNORE TABLE + UNIQURE KEY를 사용하여 MySQL 테이블에서 중복을 제거하려고 합니다.MySQL 문서에는 다음과 같이 기재되어 있습니다.

IGNORE는 표준 SQL에 대한 MySQL 확장입니다.ALTER TABLE은 새 테이블의 고유 키에 중복이 있거나 strict 모드가 활성화되었을 때 경고가 발생할 경우 어떻게 동작하는지 제어합니다.IGNORE를 지정하지 않으면 복사가 중단되고 중복 키 오류가 발생하면 롤백됩니다.IGNORE를 지정한 경우 고유 키에 중복된 행이 있는 첫 번째 행만 사용됩니다.충돌하는 다른 행은 삭제됩니다.잘못된 값은 허용 가능한 가장 가까운 값으로 잘립니다.

쿼리를 실행하면...

ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field)

오류 #1062 - 키 'dupidx'의 중복 항목 'blabla'가 아직 표시됩니다.

IGNOREMySQL로 키워드를 확장하면 일부 버전의 MySQL에서 InnoDB 버전에 버그가 있는 것 같습니다.

언제든지 MyISAM으로 변환하고 인덱스를 IGNORE-ADD한 다음 InnoDB로 다시 변환할 수 있습니다.

ALTER TABLE table ENGINE MyISAM;
ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field);
ALTER TABLE table ENGINE InnoDB;

Foreign Key 제약조건이 있는 경우 이 제약조건을 먼저 삭제한 후 나중에 다시 추가해야 합니다.

또는 session old_session_table=1을 설정해 보십시오(반복하는 것을 잊지 마십시오).

참조: http://mysqlolyk.wordpress.com/2012/02/18/alter-ignore-table-add-index-always-give-errors/

문제는 인덱싱하려는 필드에 중복 데이터가 있다는 것입니다.고유한 인덱스를 추가하려면 먼저 문제가 되는 중복 항목을 제거해야 합니다.

한 가지 방법은 다음과 같습니다.

   CREATE TABLE tmp_table LIKE table;
   ALTER IGNORE TABLE tmp_table ADD UNIQUE INDEX dupidx (field);
   INSERT IGNORE INTO tmp_table SELECT * FROM table;
   DROP TABLE table;
   RENAME TABLE tmp_table TO table;

그러면 테이블에 고유한 데이터만 삽입할 수 있습니다.

언급URL : https://stackoverflow.com/questions/8053447/mysql-alter-ignore-table-gives-integrity-constraint-violation

반응형