2013-07-24 17 views
20

Ho un errore su MySQL mentre provo ad aggiungere un CHIAVE UNICO. Ecco cosa sto cercando di fare. Ho una colonna chiamata 'unique_id' che è VARCHAR (100). Non ci sono indici definiti sulla tabella. Ho riscontrato questo errore:# 1062 - Duplicazione voce '' per chiave 'unique_id' Quando si cerca di aggiungere UNICO CHIAVE (MySQL)

#1062 - Duplicate entry '' for key 'unique_id' 

Quando provo ad aggiungere una chiave UNIQUE. Ecco uno screenshot di come sto configurarlo in phpMyAdmin:

enter image description here

Ecco la query MySQL di generare da phpMyAdmin:

ALTER TABLE `wind_archive` ADD `unique_id` VARCHAR(100) NOT NULL FIRST , 
ADD UNIQUE (
`unique_id` 
) 

Ho avuto questo problema in passato e non l'ho mai risolto, quindi ho appena ricostruito il tavolo da zero. Purtroppo in questo caso non posso farlo poiché ci sono già molte voci nella tabella. Grazie per l'aiuto!

risposta

28

L'errore dice tutto:

Duplicate entry '' 

Quindi eseguire la seguente query:

SELECT unique_id,COUNT(unique_id) 
FROM yourtblname 
GROUP BY unique_id 
HAVING COUNT(unique_id) >1 

Questa query si mostrerà anche il problema

SELECT * 
FROM yourtblname 
WHERE unique_id='' 

Questo vi mostrerà dove ci sono valori che hanno duplicati. Stai provando a creare un indice univoco su un campo con duplicati. Dovrai prima risolvere i dati duplicati e poi aggiungere l'indice.

+0

Oh ok, ho capito ora. Sì, questo è in realtà il motivo per cui sto creando il valore "unico" sull'indice. Non sapevo esattamente cosa significasse l'errore (lo stavo pensando troppo). Grazie mille, questo mi fa puntare nella giusta direzione! – MillerMedia

+0

Dato che l'aggiunta di una colonna univoca a una tabella già popolata con dati, genera questo errore poiché proverà a duplicare il valore '' in ogni riga. Se provi ad aggiungere questa colonna a una tabella vuota, non avrai alcun problema. –

11

Questa è la terza volta sto cercando una soluzione a questo problema, quindi per il riferimento sto postando la risposta qui.

A seconda dei dati, è possibile utilizzare la parola chiave IGNORE con comando Alter. Se viene specificato IGNORE, viene utilizzata solo la prima riga di righe con duplicati su una chiave univoca, le altre righe in conflitto vengono eliminate. I valori errati vengono troncati al valore accettabile corrispondente più vicino.

L'estensione di parola chiave IGNORE a MySQL sembra avere un bug in the InnoDB version su alcune versioni di MySQL.

Si può sempre, convertire in MyISAM, IGNORARE-ADD l'indice e poi riconvertire InnoDB

ALTER TABLE table ENGINE MyISAM; 
ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field); 
ALTER TABLE table ENGINE InnoDB; 

nota, se si dispone di vincoli di chiave esterna questo non funzionerà, si dovrà rimuovere quelli prima e aggiungili più tardi.

2

Fai unique_idNULL da NOT NULL e sarà risolvere il tuo problema

1
select ID from wind_archive 
where ID not in (select max(ID) from wind_archive group by unique_id) 

e questo è ciò che è necessario rimuovere dal tavolo prima di aggiungere con successo la chiave univoca. funziona anche per aggiungere una chiave univoca con 2 o più colonne. quali -

delete from wind_archive 
where ID in (
select * from (select ID from wind_archive where ID not in (
select max(ID) from wind_archive group by lastName, firstName 
) ORDER BY ID 
) AS p 
); 
+0

Ha funzionato. Puoi spiegare come funziona. – Durgaprasad

+0

se ci sono alcune righe con i loro ID non uguali al MAX (ID) di GROUP BY unique_id - sono tutte duplicazioni; al contrario, supponiamo che non ci sia alcuna duplicazione, tutto l'ID con GROUP BY unique_id dovrebbe essere uguale al proprio MAX (ID), perché è esso stesso. –

0

mi è stato sempre lo stesso errore (Duplicate entry '' per la chiave 'unique_id') quando si tenta di aggiungere una nuova colonna come unico "dopo" che avevo già creato una tabella che contiene solo i nomi di musei. Volevo tornare indietro e aggiungere un codice univoco per ogni nome di museo, con l'intenzione di inserire i valori del codice uno alla volta. Pessima pianificazione della tabella da parte mia. La mia soluzione era aggiungere la nuova colonna senza renderla unica; quindi inserito i dati per ogni codice una riga alla volta; e quindi modificare la struttura della colonna per renderla unica per le voci future. Fortunato c'erano solo 10 file.

Problemi correlati