고유 인덱스가 있는 중복 제거
중복을 방지하기 위해 A,B,C,D에 고유 인덱스를 생성했다고 생각하여 두 테이블 필드 A,B,C,D 사이에 삽입했습니다.하지만 저는 어떻게든 그것들에 대해 단순히 정상적인 지수를 만들었습니다.그래서 복제품이 들어갔습니다.2천만 개의 기록표입니다.
기존 인덱스를 일반 인덱스에서 고유 인덱스로 변경하거나 단순히 A,B,C,D에 대해 고유 인덱스를 새로 추가하는 경우 고유 레코드가 존재하므로 중복이 제거되거나 추가에 실패합니까?아직 3,000만 건의 기록을 테스트해 보겠지만, 테이블을 엉망으로 만들거나 복제하고 싶지는 않습니다.
테이블에 중복되는 항목이 있고 다음을 사용하는 경우
ALTER TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);
쿼리가 오류 1062(중복 키)와 함께 실패합니다.
하지만 만약 당신이 사용하면.IGNORE
-- (only works before MySQL 5.7.4)
ALTER IGNORE TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);
중복이 제거됩니다.그러나 문서에는 보관할 행이 명시되어 있지 않습니다.
IGNORE
는 표준 SQL에 대한 MySQL 확장입니다.그것은 방법을 통제합니다.ALTER TABLE
새 테이블의 고유 키에 중복되는 경우 또는 엄격 모드가 활성화된 경우 경고가 발생하는 경우 작동합니다.IGNORE
지정되지 않았습니다. 중복 키 오류가 발생하면 복사가 중단되고 롤백됩니다.IGNORE
고유한 키에 중복되는 행 중 하나의 행만 사용됩니다.충돌하는 다른 행은 삭제됩니다.잘못된 값은 가장 일치하는 허용 가능한 값으로 잘립니다.
MySQL 5.7.4부터는 ALTER TABLE에 대한 IGNER 절이 제거되어 사용에 오류가 발생합니다.
(ALTER TABLE 구문 변경)
버전이 5.7.4 이상인 경우 다음을 수행할 수 있습니다.
- 데이터를 임시 테이블에 복사합니다(기술적으로 임시 테이블일 필요는 없습니다).
- 원래 테이블을 잘라냅니다.
- 유니크 인덱스를 만듭니다.
- 그리고 데이터를 다시 복사할 때
INSERT IGNORE
(계속 사용 가능).
CREATE TABLE tmp_data SELECT * FROM mytable;
TRUNCATE TABLE mytable;
ALTER TABLE mytable ADD UNIQUE INDEX myindex (A, B, C, D);
INSERT IGNORE INTO mytable SELECT * from tmp_data;
DROP TABLE tmp_data;
사용하시면.
IGNORE
modifier, 를 실행하는 동안 발생하는 오류.INSERT
문은 무시됩니다.예를 들어, 없는 경우.IGNORE
, 기존 행을 복제하는 행UNIQUE
색인이나PRIMARY KEY
테이블의 value는 중복 키 오류를 발생시키고 문은 중단됩니다.와 함께IGNORE
, 행이 삭제되고 오류가 발생하지 않습니다.무시된 오류는 대신 경고를 생성합니다.
참고 항목:INSERT ... EXCHECT 구문 및 무시 키워드와 엄격 SQL 모드의 비교
중복이 있을 것 같으면 고유 인덱스를 추가하면 실패합니다.먼저 중복되는 항목을 확인합니다.
select * from
(select a,b,c,d,count(*) as n from table_name group by a,b,c,d) x
where x.n > 1
이는 2,000만 행에 대한 값비싼 쿼리일 수 있지만, 기본 인덱스를 추가할 수 없는 모든 중복 키를 얻을 수 있습니다.다 를 지정하면 이를 더할 수 .where a='some_value'
검색된 레코드의 경우 행을 고유하게 만들려면 무언가를 변경해야 합니다.그러면(쿼리가 0행을 반환함) 기본 인덱스를 추가해도 무방합니다.
무시 대신 중복 키 업데이트를 사용할 수 있으며, 이를 통해 어떤 값이 우선해야 하는지 제어할 수 있습니다.
- -UNIQUE
중복된 값이 있는 열에 제약 조건을 적용하면 오류가 발생합니다.
예를 들어 다음 스크립트를 사용해 볼 수 있습니다.
CREATE TABLE `USER` (
`USER_ID` INT NOT NULL,
`USERNAME` VARCHAR(45) NOT NULL,
`NAME` VARCHAR(45) NULL,
PRIMARY KEY (`USER_ID`));
INSERT INTO USER VALUES(1,'apple', 'woz'),(2,'apple', 'jobs'),
(3,'google', 'sergey'),(4,'google', 'larry');
ALTER TABLE `USER`
ADD UNIQUE INDEX `USERNAME_UNIQUE` (`USERNAME` ASC);
/*
Operation failed: There was an error while applying the SQL script to the database.
ERROR 1062: Duplicate entry 'apple' for key 'USERNAME_UNIQUE'
*/
언급URL : https://stackoverflow.com/questions/36647058/removing-duplicates-with-unique-index
'source' 카테고리의 다른 글
CentOS 6.2에서 MySQL 버전을 5.1에서 5.5로 업데이트 (0) | 2023.10.14 |
---|---|
바운드 매개변수를 여러 번 사용 (0) | 2023.10.14 |
Excel에서 SQL DATTIME 삽입? (0) | 2023.10.09 |
MySQL 구성 파일을 다시 시작하지 않고 새로 고치려면 어떻게 해야 합니까? (0) | 2023.10.09 |
봄 부팅 앱에서 BIRT (0) | 2023.10.09 |