web-dev-qa-db-fra.com

Comment empêcher les enregistrements en double de ma table Insérer ignorer ne fonctionne pas ici

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 |
    +-----+---------+------+------+------+

Voici ma table. Je veux éliminer ou empêcher l'insertion des enregistrements en double, car le champ eno est auto increment nombre total de lignes, il ne faut jamais dupliquer, mais les enregistrements sont en double. How can I prevent inserting those duplicate records

j'ai essayé d'utiliser INSERT IGNORE AND ON DUPLICATE KEY UPDATE ( Je pense que je ne les ai pas utilisés correctement ).

La façon dont je les ai utilisés est,

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    |                |
+-------+-------------+------+-----+---------+----------------+

quelqu'un peut-il me donner une solution à cet égard?

Merci.

11
Chella

modifier la table en ajoutant la contrainte UNIQUE

ALTER TABLE employee ADD CONSTRAINT emp_unique UNIQUE (ename,dno,mgr,sal)

mais vous pouvez le faire si la table employee est vide.

ou si des enregistrements existaient, essayez d'ajouter IGNORE

ALTER IGNORE TABLE employee ADD CONSTRAINT emp_unique UNIQUE (ename,dno,mgr,sal)

UPDATE 1

Quelque chose s'est mal passé, je suppose. Vous devez uniquement ajouter une contrainte unique sur la colonne ename car eno sera toujours unique en raison de AUTO_INCREMENT

Afin d'ajouter une contrainte unique, vous devez effectuer des nettoyages sur votre table.

Les requêtes ci-dessous suppriment certains enregistrements en double et modifient la table en ajoutant une contrainte unique sur la colonne 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);

Voici une démonstration complète

17
John Woo

Créez un UNIQUE CONSTRAINT sur lequel, selon vous, le double emploi existe.

comme 

ALTER TABLE MYTABLE ADD CONSTRAINT constraint1 UNIQUE(column1, column2, column3)
5
Sashi Kant

Cela fonctionnera que vous nettoyiez d'abord votre table (c'est-à-dire que vous puissiez arrêter d'insérer des doublons immédiatement et nettoyer sur une planification séparée) et sans avoir à ajouter de contrainte unique ou à modifier la table de toute autre manière:

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

La requête ci-dessus suppose que vous voulez utiliser ename comme champ "unique", mais de la même manière, vous pouvez définir n'importe quel autre champ ou ses combinaisons comme unique aux fins de cette INSERT.

Cela fonctionne parce que c'est un format INSERT ... SELECT où la partie SELECT ne produit qu'une ligne (c'est-à-dire quelque chose à insérer) si sa partie gauche emp n'a pas déjà cette valeur. Naturellement, si vous vouliez changer le (s) champ (s) défini (s) cette "unicité", vous modifieriez la SELECT et le LEFT JOIN en conséquence.

1
Unix One