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.
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
Créez un UNIQUE CONSTRAINT
sur lequel, selon vous, le double emploi existe.
comme
ALTER TABLE MYTABLE ADD CONSTRAINT constraint1 UNIQUE(column1, column2, column3)
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.