2013-07-24 29 views
20

ユニークキーを追加しようとしているときにMySQLでエラーが発生しました。ここに私がやろうとしていることがあります。私は 'unique_id'というVARCHAR(100)という列を持っています。テーブルに定義されたインデックスはありません。このエラーが発生しました:#1062 - キー 'unique_id'の重複エントリ ''ユニークキーを追加しようとしたとき(MySQL)

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

ユニークキーを追加しようとしました。ここで私はphpMyAdminの中でそれを設定していかのスクリーンショットです:ここで

enter image description here

はのは、phpMyAdminのことで発生するMySQLのクエリです:

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

私は過去にこの問題を持っていました決してそれを解決しなかったので、私はテーブルを最初から再構築しました。残念ながらこの場合、テーブルにはすでに多くのエントリがあるので、これを行うことはできません。ご協力いただきありがとうございます!

答えて

28

エラーがそれをすべて言う:

Duplicate entry '' 

したがって、次のクエリを実行します。

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

このクエリも

SELECT * 
FROM yourtblname 
WHERE unique_id='' 

あなたに問題が表示されますこれはどこに表示されます重複する値があります。重複しているフィールドにユニークなインデックスを作成しようとしています。重複したデータを解決してから索引を追加する必要があります。

+0

ああ、今すぐ取得します。うん、それは実際に私がインデックス上に「ユニークな」価値を作り出す理由です。私はエラーの意味を正確には知らなかった(私はそれを思っていた)。おかげさまで、私は正しい方向を指摘してくれます! – MillerMedia

+0

すでにデータが格納されているテーブルに一意の列を追加すると、各行に値 ''を試して複製するため、このエラーが発生します。 この列を空のテーブルに追加しようとすると、問題は発生しません。 –

11

これは3回目ですが、私はこの問題の解決策を探していますので、参考のためにここに回答を投稿しています。

データによっては、AlterコマンドでIGNOREキーワードを使用することがあります。 IGNOREを指定すると、一意のキーに重複する行の最初の行のみが使用され、他の競合する行は削除されます。不正確な値は、最も適合する許容値に切り捨てられます。

IGNORE MySQLのキーワード拡張は、MySQLの一部のバージョンではbug in the InnoDB versionと思われます。

あなたは常に、あなたが外部キー制約がある場合、これは動作しません、あなたが最初にそれらを削除する必要があります、IGNORE-ADD指数、その後、バックInnoDBの

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

を変換ノート、MyISAMテーブルに変換することができそれらを後で追加します。

2

NOT NULLからunique_idNULLを作成し、それが

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

あなたの問題を解決すると、これはあなたが正常に一意のキーを追加する前にテーブルから削除するべきものです。 これは、2つ以上の列を持つ一意キーを追加する場合にも機能します。 など - 私は(「UNIQUE_ID「キーのための」重複したエントリ」)同じエラーを得ていた

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

それは働いた。これがどのように機能するか説明してください。 – Durgaprasad

+0

IDのある行がGROUP BYのunique_idのMAX(ID)と等しくない場合は、すべて重複しています。 これとは対照的に、重複がないと仮定すると、それ自身であるため、GROUP BYのunique_idを持つすべてのIDは、それ自身のMAX(ID)に等しくなければなりません。 –

0

「後」などのユニークな新しい列を追加しようとしたとき、私はすでにの名前だけを含むテーブルを作成していました美術館。私は戻って、コード値を1つずつ挿入するという目的で、各博物館名に固有のコードを追加したかったのです。私の部分での貧弱なテーブル計画。 私のソリューションは、一意にすることなく新しい列を追加することでした。一度に1行ずつ各コードのデータを入力します。列構造を変更して将来のエントリでユニークにすることができます。幸運にも、10行しかありませんでした。

関連する問題