복붙노트

[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. ==============================

    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. ==============================

    2.당신이 duplicacy의 존재를 생각하는 UNIQUE 제약 조건을 만듭니다.

    당신이 duplicacy의 존재를 생각하는 UNIQUE 제약 조건을 만듭니다.

    처럼

    ALTER TABLE MYTABLE ADD CONSTRAINT constraint1 UNIQUE(column1, column2, column3)
    
  3. ==============================

    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 형식이기 때문에 그것은 작동합니다. 물론, 경우 필드 (들)이 "독창성"당신이 선택하고 왼쪽은 그에 따라 가입 수정하는 것이 정의 변경을 원했습니다.

  4. 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