web-dev-qa-db-ja.com

#1062-一意のキー(MySQL)を追加しようとすると、キー 'unique_id'のエントリ ''が重複する

一意のキーを追加しようとしたときに、MySQLでエラーが発生しました。これが私がやろうとしていることです。 VARCHAR(100)である「unique_id」という列があります。テーブルにインデックスが定義されていません。私はこのエラーを受け取っています:

#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`
)

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

27
MillerMedia

エラーはそれをすべて言います:

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=''

これにより、重複する値がある場所が表示されます。重複するフィールドに一意のインデックスを作成しようとしています。最初に重複データを解決してから、インデックスを追加する必要があります。

35
Namphibian

この問題の解決策を探しているのは3回目なので、参考のためにここに回答を掲載しています。

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

MySQLのIGNOREキーワード拡張は、MySQLの一部のバージョンで InnoDBバージョンのバグ を持っているようです。

いつでも、MyISAMに変換し、インデックスをIGNORE-ADDしてから、InnoDBに変換することができます

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

外部キー制約がある場合、これは機能しないことに注意してください。最初にそれらを削除し、後で追加し直す必要があります。

14
RQube

unique_idNULL from NOT NULLそしてそれはあなたの問題を解決します

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

これは、一意のキーを正常に追加する前にテーブルから削除する必要があるものです。これは、2列以上の一意のキーを追加する場合にも機能します。といった -

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
);
1
Ning Yu Fisher

新しい列を一意の「後」として追加しようとすると、同じ博物館名のみを含むテーブルをすでに作成していたときに、同じエラー(キー 'unique_id'の重複エントリ '')が発生していました。コード値を1つずつ挿入するために、戻って各博物館名に固有のコードを追加したかったのです。私の側の貧弱なテーブル計画。私の解決策は、新しい列を一意にせずに追加することでした。次に、各コードのデータを一度に1行ずつ入力しました。その後、列構造を変更して、将来のエントリで一意になるようにします。幸運なことに10行しかありませんでした。

0
T. Bulford

クエリを記述するため、unique_idはNOT NULLであり、前の行はすべてNULLであり、この列を一意にする必要があります。このクエリを実行すると、同じ値を持つ複数の行があり、この列は一意ではありません。クエリでunique_id NOT NULLをunique_id NULLに変更する必要があります。

0