2013-07-24 23 views
20

Bir UNIQUE TUŞU eklemeye çalışırken bir hatam var. İşte yapmaya çalıştığım şey. VARCHAR (100) olan 'unique_id' adında bir sütüm var. Tabloda tanımlanmış dizin bulunmamaktadır. Bu hatayı alıyorum: Bir UNIQUE anahtarı eklemeye çalıştığımda.# 1062 - '' benzersiz_id '' anahtarının '' için girdi '' UNIQUE KEY (MySQL) eklemeye çalışırken '

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

geçmişte bu sorunu yaşadım:

İşte enter image description here

en phpMyAdmin tarafından oluşturmak MySQL sorgusu: Burada nasıl phpMyAdmin'de bunu kuruyorum bir ekran görüntüsü ve asla çözmedim, bu yüzden tabloyu sıfırdan yeniden oluşturdum. Maalesef bu durumda, tablodaki birçok giriş olduğu için bunu yapamam. Yardım ettiğin için teşekkür ederim!

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

Bu sorgu ayrıca bu sizi nereye gösterecektir

SELECT * 
FROM yourtblname 
WHERE unique_id='' 

sorunu gösterecektir:

Duplicate entry '' 

Yani aşağıdaki sorguyu çalıştırın:

cevap

28

hata hepsi diyor çiftleri olan değerler var. Yinelenen bir alanda benzersiz bir dizin oluşturmaya çalışıyorsunuz. Önce kopya verileri çözmeniz ve ardından dizini eklemeniz gerekir.

+0

Tamam, şimdi anladım. Evet bu aslında indekste 'benzersiz' değeri yaratmamın sebebidir. Hatanın ne anlama geldiğini tam olarak bilmiyordum (bunu gözden kaçırıyordum). Çok teşekkürler, bu beni doğru yöne işaret ediyor! – MillerMedia

+0

Verilerle önceden doldurulmuş bir tabloya benzersiz bir sütun eklediğinizden, bu hatayı, her satırdaki '' değerini girip çoğaltacağından atar. Bu sütunu boş bir tabloya eklemeye çalışırsanız, sorun yaşamayacaksınız. –

11

Bu problemin çözümü için 3 kez arıyorum, bu nedenle referans için burada cevabı gönderiyorum.

Verilere bağlı olarak, Alter komutuyla IGNORE anahtar sözcüğünü kullanabiliriz. IGNORE belirtilirse, yalnızca ilk satır benzersiz bir anahtarda yinelenen satırlardan kullanılır, Diğer çakışan satırlar silinir. Yanlış değerler, en yakın eşleşen kabul edilebilir değere kısaltılır.

MySQL'e ait IGNORE anahtar sözcüğü uzantısı, MySQL'in bazı sürümlerinde bug in the InnoDB version görünüyor.

Hep, bu işe yaramaz yabancı anahtar kısıtlamaları varsa,

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

Not InnoDB için geri dönüştürmek ardından endeksi YOKSAY-ADD ve MyISAM dönüştürmek olabilir

, önce o kaldırmak zorunda kalacak ve onları daha sonra tekrar ekleyin.

2

NOT NULL den unique_idNULL yapın ve senin sorunun

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

çözecektir ve bu başarılı benzersiz anahtarı eklemeden önce tablodan kaldırmak gereken budur. bu, 2 veya daha fazla sütunlu benzersiz anahtar eklemek için de çalışır. gibi - I ('unique_id 'tuşuna için' Mükerrer giriş') aynı hatayı başlamıştı

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

Çalıştı. Bunun nasıl çalıştığını açıklayabilir misiniz? – Durgaprasad

+0

, kimlikleriyle birlikte bazı satırlar varsa, GROUP BY unique_id öğesinin MAX (ID) değerine eşit değildir - hepsi çoğaltılır; Aksine , çoğaltma olmadığını, GROUP BY unique_id ile tüm ID'nin kendi MAX (ID) değerine eşit olması gerektiğini varsayın. –

0

"sonra" gibi benzersiz yeni bir sütun eklemek çalışırken zaten sadece isimlerini içeren bir tablo yaratmıştı müzeler. Her bir müze adı için kod değerlerini birer birer eklemek için geri dönüp benzersiz bir kod eklemek istedim. Zavallı masa planımı üzerimde. Çözümüm, yeni sütunu benzersiz yapmadan eklemekti; Daha sonra her kod için verileri bir defada bir satır girmiş; ve sonra gelecekteki girişler için benzersiz hale getirmek için sütun yapısını değiştirerek. Şanslı sadece 10 satır vardı.

İlgili konular