[SQL] 삽입 여기서 일하지 않는 무시 내 테이블에서 중복 레코드를 방지하는 방법
SQL삽입 여기서 일하지 않는 무시 내 테이블에서 중복 레코드를 방지하는 방법
mysql> select * from emp;
+-----+---------+------+------+------+
| eno | ename | dno | mgr | sal |
+-----+---------+------+------+------+
| 1 | rama | 1 | NULL | 2000 |
| 2 | kri | 1 | 1 | 3000 |
| 4 | kri | 1 | 2 | 3000 |
| 5 | bu | 1 | 2 | 2000 |
| 6 | bu | 1 | 1 | 2500 |
| 7 | raa | 2 | NULL | 2500 |
| 8 | rrr | 2 | 7 | 2500 |
| 9 | sita | 2 | 7 | 1500 |
| 10 | dlksdgj | 2 | 2 | 2000 |
| 11 | dlksdgj | 2 | 2 | 2000 |
| 12 | dlksdgj | 2 | 2 | 2000 |
| 13 | dlksdgj | 2 | 2 | 2000 |
| 14 | dlksdgj | 2 | 2 | 2000 |
+-----+---------+------+------+------+
여기 내 테이블입니다. 나는 ENO 필드가 중복 결코 자동 증가 총 행이기 때문에, 제거 또는 중복 레코드의 삽입을 방지하기 원하지만 기록은 중복입니다. 어떻게 그 중복 레코드를 삽입 I 방지 할 수 있습니까?
나는 INSERT는 무시하고 DUPLICATE KEY UPDATE가 (내가 제대로 사용하지 않은 생각)를 사용했습니다.
내가 그들을 사용하는 방법이며,
mysql> insert into emp(ename,dno,mgr,sal) values('dlksdgj',2,2,2000);
Query OK, 1 row affected (0.03 sec)
mysql> insert ignore into emp(ename,dno,mgr,sal) values('dlksdgj',2,2,2000);
Query OK, 1 row affected (0.03 sec)
mysql> insert into emp(ename,dno,mgr,sal) values('dlksdgj',2,2,2000) ON DUPLICATE KEY UPDATE eno=eno;
Query OK, 1 row affected (0.03 sec)
mysql> insert into emp(ename,dno,mgr,sal) values('dlksdgj',2,2,2000) ON DUPLICATE KEY UPDATE eno=eno;
Query OK, 1 row affected (0.04 sec
mysql> desc emp;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| eno | int(11) | NO | PRI | NULL | auto_increment |
| ename | varchar(50) | YES | | NULL | |
| dno | int(11) | YES | | NULL | |
| mgr | int(11) | YES | MUL | NULL | |
| sal | int(11) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
해결법
-
==============================
1.UNIQUE 제약 조건을 추가하여 테이블을 변경
UNIQUE 제약 조건을 추가하여 테이블을 변경
ALTER TABLE employee ADD CONSTRAINT emp_unique UNIQUE (ename,dno,mgr,sal)
테이블 직원이 비어있는 경우 그러나 당신은이 작업을 수행 할 수 있습니다.
기록이 존재하는 경우 나, 무시 추가 시도
ALTER IGNORE TABLE employee ADD CONSTRAINT emp_unique UNIQUE (ename,dno,mgr,sal)
UPDATE 1
문제가 발생했습니다 것 같아요. 당신은 ENO 항상 AUTO_INCREMENT 고유 인해되기 때문에 열 ENAME에 고유 제한 조건을 추가해야합니다.
고유 제한 조건을 추가하려면, 당신은 당신의 테이블에 몇 가지 정리를 할 필요가있다.
쿼리는 아래의 열 ENAME에 고유 제한 조건을 추가하여 일부 중복 레코드를 삭제하고 변경합니다 테이블.
DELETE a FROM Employee a LEFT JOIN ( SELECT ename, MIN(eno) minEno FROM Employee GROUP BY ename ) b ON a.eno = b.minEno WHERE b.minEno IS NULL; ALTER TABLE employee ADD CONSTRAINT emp_unique UNIQUE (ename);
여기에 전체 데모입니다
-
==============================
2.당신이 duplicacy의 존재를 생각하는 UNIQUE 제약 조건을 만듭니다.
당신이 duplicacy의 존재를 생각하는 UNIQUE 제약 조건을 만듭니다.
처럼
ALTER TABLE MYTABLE ADD CONSTRAINT constraint1 UNIQUE(column1, column2, column3)
-
==============================
3.이 관계없이 먼저 테이블을 정리 여부에 작동합니다 (즉, 즉시 중복 삽입을 중지하고 별도의 일정을 정리할 수 있습니다) 및 고유 제한 조건을 추가 할 필요하거나 다른 방법으로 테이블을 변경하지 않고 :
이 관계없이 먼저 테이블을 정리 여부에 작동합니다 (즉, 즉시 중복 삽입을 중지하고 별도의 일정을 정리할 수 있습니다) 및 고유 제한 조건을 추가 할 필요하거나 다른 방법으로 테이블을 변경하지 않고 :
INSERT INTO emp (ename, dno, mgr, sal) SELECT e.ename, 2, 2, 2000 FROM (SELECT 'dlksdgj' AS ename) e LEFT JOIN emp ON e.ename = emp.ename WHERE emp.ename IS NULL
위의 쿼리는 당신이 "독특한"필드로 ENAME을 사용하고자하는 가정하지만, 같은 방법으로이 INSERT의 목적에 대해 고유로 다른 분야 또는 조합을 정의 할 수 있습니다.
그것의 왼쪽에 합류 EMP가 이미 값이없는 경우 SELECT 부분은 행 (삽입에 즉 뭔가를) 생성하는 INSERT ... SELECT 형식이기 때문에 그것은 작동합니다. 물론, 경우 필드 (들)이 "독창성"당신이 선택하고 왼쪽은 그에 따라 가입 수정하는 것이 정의 변경을 원했습니다.
from https://stackoverflow.com/questions/14028093/how-to-prevent-duplicate-records-from-my-table-insert-ignore-does-not-work-here by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] SQL 시간이 여러 중복 간격에서 경과 찾을 수 (0) | 2020.07.04 |
---|---|
[SQL] 이 행의 위치를 포함하도록 업데이트 칼럼 (0) | 2020.07.04 |
[SQL] SQL : 연속 기록에 그룹으로 (0) | 2020.07.04 |
[SQL] 이 SELECT 쿼리는 마무리 180 초 소요 (0) | 2020.07.04 |
[SQL] 지난 일요일 찾기 (0) | 2020.07.03 |