2013-07-24 20 views
20

Mam błąd w MySQL podczas próby dodania UNIKALNEGO KLUCZA. Oto, co próbuję zrobić. Mam kolumnę o nazwie "unique_id", która jest VARCHAR (100). Brak zdefiniowanych indeksów w tabeli. Otrzymuję ten błąd:# 1062 - Zduplikowany wpis '' dla klucza 'unique_id' Podczas próby dodania UNIQUE KEY (MySQL)

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

Kiedy próbuję dodać klucz UNIQUE. Oto zrzut ekranu jak ja jej utworzeniu w phpMyAdmin:

enter image description here

Oto zapytań MySQL to generowanie przez phpMyAdmin:

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

miałem ten problem w przeszłości i nigdy go nie rozwiązałem, więc po prostu przebudowałem stół od zera. Niestety w tym przypadku nie mogę tego zrobić, ponieważ już jest wiele wpisów w tabeli. Dzięki za pomoc!

Odpowiedz

28

Błąd mówi wszystko:

Duplicate entry '' 

więc uruchomić następujące zapytanie:

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

To zapytanie będzie również pokazać problem

SELECT * 
FROM yourtblname 
WHERE unique_id='' 

To będzie cię tam, gdzie pokazać istnieją wartości, które mają duplikaty. Próbujesz utworzyć unikalny indeks na polu z duplikatami. Najpierw należy rozwiązać duplikaty danych, a następnie dodać indeks.

+0

Dobra, rozumiem. Tak, właśnie dlatego tworzę "unikalną" wartość indeksu. Nie wiedziałem dokładnie, co oznacza ten błąd (nadmiernie go przemyślałem). Dziękuję bardzo, że doprowadza mnie we właściwym kierunku! – MillerMedia

+0

Od momentu dodania unikatowej kolumny do tabeli już wypełnionej danymi, zostanie zgłoszony ten błąd, ponieważ spróbuje on zduplikować wartość "" w każdym wierszu. Jeśli spróbujesz dodać tę kolumnę do pustej tabeli, nie będziesz miał problemu. –

11

To już 3 raz szukam rozwiązania tego problemu, więc dla odniesienia zamieszczam tutaj odpowiedź.

W zależności od danych możemy użyć słowa kluczowego IGNORE z poleceniem Alter. Jeśli określono IGNORE, tylko pierwszy wiersz jest używany w wierszach z duplikatami na kluczu unikatowym, Pozostałe kolidujące wiersze są usuwane. Niepoprawne wartości są obcinane do najbliższej pasującej wartości dopuszczalnej.

Rozszerzenie słowa kluczowego do MySQL na IGNORE wydaje się mieć numer bug in the InnoDB version w niektórych wersjach MySQL.

Zawsze mógłby przekształcić się MyISAM, ignorowanych dodać indeks, a następnie przekonwertować z powrotem do InnoDB

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

Uwaga, jeśli masz klucz obcy to nie zadziała, trzeba będzie usunąć te pierwsze i dodaj je później.

2

Bądź unique_idNULL z NOT NULL i będzie rozwiązać problem

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

i to, co należy usunąć z tabeli, zanim pomyślnie dodać unikalny klucz. to również działa w celu dodania unikalnego klucza z 2 lub więcej kolumnami. takich jak -

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

Zadziałało. Czy możesz wyjaśnić, jak to działa? – Durgaprasad

+0

jeśli niektóre wiersze z ich identyfikatorami nie są równe MAX (ID) GROUP BY unique_id - wszystkie są duplikacjami; przeciwnie, załóżmy, że nie ma duplikacji, cały identyfikator z GROUP BY unique_id powinien być równy własnemu MAX (ID), ponieważ sam jest. –

0

byłem coraz ten sam błąd (wpis Duplikat „” key „unique_id”), gdy próbuje dodać nową kolumnę jako wyjątkowy „po” Ja już stworzył tabelę zawierającą tylko nazwy muzea. Chciałem wrócić i dodać unikalny kod dla każdej nazwy muzeum, z zamiarem wstawienia wartości kodu po jednym na raz. Złe planowanie stołu z mojej strony. Moim rozwiązaniem było dodanie nowej kolumny bez tworzenia jej unikatowej; następnie wprowadzono dane dla każdego kodu po jednym wierszu na raz; a następnie zmianę struktury kolumny, aby była unikalna dla przyszłych wpisów. Na szczęście było tylko 10 rzędów.