2012-12-25 7 views
10
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 | 
    +-----+---------+------+------+------+ 

Ecco la mia tabella. Voglio eliminare o impedire inserimento dei record duplicati, poiché il campo eno è auto increment la riga totale non deve mai essere duplicata, ma i record sono duplicati. How can I prevent inserting those duplicate records,Come evitare i record duplicati dalla mia tabella Inserisci ignora non funziona qui

Ho provato ad utilizzare INSERT IGNORE AND ON DUPLICATE KEY UPDATE (penso io non li ho utilizzati correttamente).

Il modo che ho usato loro è,

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

Qualcuno mi può dare una soluzione a questo proposito?

Grazie.

+0

puoi pubblicare il risultato di questa query 'DESC Employee'? –

+0

qual è la/le colonna/e in cui si desidera che i valori siano univoci? –

+0

qualcuno può darmi altre query più ottimizzate per questo .. ?? – Chella

risposta

15

alterare la tabella con l'aggiunta di UNIQUE vincolo

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

ma si può fare questo se la tabella employee è vuota.

o se esistessero record, prova ad aggiungere IGNORE

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

UPDATE 1

Qualcosa è andato storto, immagino. È sufficiente aggiungere un vincolo univoco sulla colonna ename poiché eno sarà sempre univoco a causa di AUTO_INCREMENT.

Per aggiungere un vincolo univoco, è necessario eseguire alcune pulizie sul tavolo.

Le query seguenti eliminano alcuni record duplicati e alterano la tabella aggiungendo un vincolo univoco alla colonna 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); 

Ecco una dimostrazione completa

+0

c'è un altro modo ... di usare questo vincolo di chiave univoco dato che non ho il permesso di cambiare la struttura della tabella ... non posso eliminarlo prima di inserirmi senza usare univoco – Chella

+0

uhmm, * Penso *, ** nessuno ** dal momento che non hai il privilegio di alterare il tavolo. l'unico modo per farlo è controllarlo contro il tavolo per l'esistenza dei record. –

+0

sì esattamente come potrei farlo ..? – Chella

4

Creare un UNIQUE CONSTRAINT su cui si ritiene che il duplicacy esiste.

come

ALTER TABLE MYTABLE ADD CONSTRAINT constraint1 UNIQUE(column1, column2, column3) 
1

Questo funziona indipendentemente dal fatto che ripulire il tavolo prima (cioè si può fermare l'inserimento immediatamente i duplicati e ripulire in programma a parte) e senza dover aggiungere alcun vincolo unici o tabella che alterano in qualsiasi altro modo:

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 query sopra presuppone che si desidera utilizzare ename come un campo di "unico", ma allo stesso modo si potrebbe definire qualsiasi altri campi o loro combinazioni come unico ai fini del presente 012..

Esso funziona perché è un formato INSERT ... SELECT dove la parte SELECT produce solo una fila (cioè qualcosa per inserire) se sinistra unita emp non già di quel valore. Naturalmente, se si volesse modificare quale/i campo/i ha definito questa "unicità", si modificherà lo SELECT e lo LEFT JOIN di conseguenza.