MySQL-중복 처리
일반적으로 테이블 또는 결과 집합에 중복 레코드가 포함되는 경우가 있습니다. 대부분의 경우 허용되지만 중복 레코드를 중지해야하는 경우도 있습니다. 중복 레코드를 식별하고 테이블에서 제거해야합니다. 이 장에서는 테이블에서 중복 레코드 발생을 방지하는 방법과 기존 중복 레코드를 제거하는 방법에 대해 설명합니다.
테이블에서 중복 발생 방지
사용할 수 있습니다 PRIMARY KEY 또는 UNIQUE 중복 레코드를 중지하기 위해 적절한 필드가있는 테이블의 색인화.
예를 들어 보겠습니다. 다음 표에는 이러한 인덱스 나 기본 키가 포함되어 있지 않으므로 first_name 과 last_name.
CREATE TABLE person_tbl (
first_name CHAR(20),
last_name CHAR(20),
sex CHAR(10)
);
이름과 성 값이 같은 여러 레코드가이 테이블에 생성되지 않도록하려면 PRIMARY KEY그 정의에. 이렇게하면 인덱싱 된 열을 다음과 같이 선언해야합니다.NOT NULL, 왜냐하면 PRIMARY KEY 허용하지 않습니다 NULL 값-
CREATE TABLE person_tbl (
first_name CHAR(20) NOT NULL,
last_name CHAR(20) NOT NULL,
sex CHAR(10),
PRIMARY KEY (last_name, first_name)
);
테이블에 고유 인덱스가 있으면 일반적으로 인덱스를 정의하는 열의 기존 레코드를 복제하는 레코드를 테이블에 삽입하면 오류가 발생합니다.
사용 INSERT IGNORE 대신 명령 INSERT명령. 레코드가 기존 레코드를 복제하지 않으면 MySQL은 평소와 같이 삽입합니다. 레코드가 중복 된 경우IGNORE 키워드는 MySQL에 오류를 생성하지 않고 자동으로 삭제하도록 지시합니다.
다음 예제는 오류가 발생하지 않으며 동시에 중복 레코드도 삽입하지 않습니다.
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
-> VALUES( 'Jay', 'Thomas');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT IGNORE INTO person_tbl (last_name, first_name)
-> VALUES( 'Jay', 'Thomas');
Query OK, 0 rows affected (0.00 sec)
사용 REPLACEINSERT 명령이 아닌 명령. 새 레코드 인 경우 INSERT와 마찬가지로 삽입됩니다. 중복 된 경우 새 레코드가 이전 레코드를 대체합니다.
mysql> REPLACE INTO person_tbl (last_name, first_name)
-> VALUES( 'Ajay', 'Kumar');
Query OK, 1 row affected (0.00 sec)
mysql> REPLACE INTO person_tbl (last_name, first_name)
-> VALUES( 'Ajay', 'Kumar');
Query OK, 2 rows affected (0.00 sec)
INSERT IGNORE 및 REPLACE 명령은 적용하려는 중복 처리 동작에 따라 선택해야합니다. INSERT IGNORE 명령은 중복 된 레코드의 첫 번째 세트를 유지하고 나머지는 버립니다. REPLACE 명령은 마지막 중복 세트를 유지하고 이전 항목을 지 웁니다.
고유성을 강화하는 또 다른 방법은 UNIQUE 테이블에 대한 PRIMARY KEY가 아닌 인덱스.
CREATE TABLE person_tbl (
first_name CHAR(20) NOT NULL,
last_name CHAR(20) NOT NULL,
sex CHAR(10)
UNIQUE (last_name, first_name)
);
중복 계산 및 식별
다음은 테이블에서 first_name 및 last_name이있는 중복 레코드를 계산하는 쿼리입니다.
mysql> SELECT COUNT(*) as repetitions, last_name, first_name
-> FROM person_tbl
-> GROUP BY last_name, first_name
-> HAVING repetitions > 1;
이 쿼리는 person_tbl 테이블의 모든 중복 레코드 목록을 반환합니다. 일반적으로 중복되는 값 세트를 식별하려면 아래 단계를 따르십시오.
중복 될 수있는 값이 포함 된 열을 판별하십시오.
열 선택 목록에 해당 열을 COUNT(*).
열을 나열하십시오. GROUP BY 절도 마찬가지입니다.
추가하다 HAVING 그룹 수를 1보다 크게 요구하여 고유 한 값을 제거하는 절.
쿼리 결과에서 중복 제거
당신은 사용할 수 있습니다 DISTINCT 명령을 SELECT 문과 함께 사용하여 테이블에서 사용할 수있는 고유 한 레코드를 찾습니다.
mysql> SELECT DISTINCT last_name, first_name
-> FROM person_tbl
-> ORDER BY last_name;
DISTINCT 명령에 대한 대안은 선택한 열의 이름을 지정하는 GROUP BY 절을 추가하는 것입니다. 이는 중복을 제거하고 지정된 열에서 값의 고유 한 조합 만 선택하는 효과가 있습니다.
mysql> SELECT last_name, first_name
-> FROM person_tbl
-> GROUP BY (last_name, first_name);
테이블 교체를 사용하여 중복 제거
테이블에 중복 레코드가 있고 해당 테이블에서 모든 중복 레코드를 제거하려면 아래 제공된 절차를 따르십시오.
mysql> CREATE TABLE tmp SELECT last_name, first_name, sex
-> FROM person_tbl;
-> GROUP BY (last_name, first_name);
mysql> DROP TABLE person_tbl;
mysql> ALTER TABLE tmp RENAME TO person_tbl;
테이블에서 중복 레코드를 제거하는 쉬운 방법은 해당 테이블에 INDEX 또는 PRIMARY KEY를 추가하는 것입니다. 이 테이블을 이미 사용할 수있는 경우에도이 기술을 사용하여 중복 레코드를 제거 할 수 있으며 앞으로도 안전합니다.
mysql> ALTER IGNORE TABLE person_tbl
-> ADD PRIMARY KEY (last_name, first_name);