• ベストアンサー

すでにあるテーブルのフィールドにユニークキーを設定できますか?

はじめまして。 私のレンタルサーバーには最初からMYSQLというデータベースが付いています。 テーブルを設定して、すでにいくつかのデータを入力しています。 最近、重複して同じIDが入力できることに気づきました。 重複できないようにしたいと思い、調べたところ、ユニークキーというものを設定すれば重複しないらしいと言うことを知りました。 そちらのレンタルサーバーにはすでにPHPMYADMINが使えるようになっています。 PHPMYADMINをつかってIDのフィールドにユニークキーを設定しようとしました。 すると下記のようなエラーがでて、ユニークキーの設定に失敗しました。 > エラー > 実行した SQL 照会: > > ALTER TABLE `テーブルの名前` ADD UNIQUE ( > > `フィールドの名前` > ); > すでにデータが入力されているテーブルのフィールドにはユニークキーは設定できないのでしょうか? もし、すでにデータが入力されているテーブルのフィールドにユニークキーを設定する方法があったら教えてください。 もしくは私が勘違いをしている部分があったら教えて頂ければ幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>すでにデータが入力されているテーブルのフィールドにはユニークキーは >設定できないのでしょうか? できますね ただし、ユニークな状態になっていないといけません。 (※ユニーク設定しようとしているのですから当然ですよね) ダブっているデータを SELECT `フィールドの名前`,count(*) AS `要素数` FROM `テーブルの名前` GROUP BY `フィールドの名前` having `要素数`>1 などとして探し、 手動もしくはSQLでユニークな状態にもっていかないと ユニーク設定はできません。

OKIaHUKUOKA
質問者

補足

> 手動もしくはSQLでユニークな状態にもっていかないと > ユニーク設定はできません。 回答ありがとうございます。 phpmyadminで確認したのですが、重複しているデータはありません。 なのにエラーが出るので困っています。

その他の回答 (2)

回答No.3

#2回答者です。 > #1170 - BLOB column 'no' used in key specification without a key length 返されたメッセージの通りなのですが? 対象としている列のデータ型は、BLOBですよね?その場合、インデクスを付ける(ユニークにする)には、「列名(キー長)」という形式で指定する必要があります。 つまり、今回の例では、 「alter table `表名` add unique(`列名`(キー長))」 といった指定をする必要があります。 BLOBは非常に長い(大きい)データを格納できる一方で、キーとして扱う部分は長さを指定して限定する必要があるほか、操作も制限されます。 ところで、BLOBに対してユニーク設定をするというのは、非常に珍しい使い方だと思います。BLOBの列は、画像などのバイナリデータを格納することが想定されていますが、列のデータ型の選定は適切に行われているでしょうか? ユニーク指定が必要な列なら、varchar等が適切だと思いますけど?

OKIaHUKUOKA
質問者

お礼

ありがとうございました。 データ型を「varchar」に変更したところ、ユニークキーが設定できました。 データ型は使い分けの基準がよく分からないので最初、txtに設定してありました。 「大は小を兼ねる」と思っていました。 お手数をおかけしました。

回答No.2

データを格納済の状態で、ユニークキーの設定は可能です。ただし、格納データ中に既に重複が存在する状態では、当然、行えません。 >PHPMYADMINをつかってIDのフィールドにユニークキーを設定しよう~ すると下記のようなエラーがでて 具体的には、どんなエラーですか? 「重複している」というエラーではないでしょうか? 以下のような手順で作業する必要があります。 (1)重複データを調査 (2)重複データを削除する等の対策を行う (3)ユニークキーを設定 (1)重複データの調査 表t1の列c1で、重複している値を調べる場合は、以下のようなSQLで調べられます。 select c1 from t1 group by c1 having count(*)>1; MySQLのバージョンが示されていませんが、今後も質問する場合は、バージョンを明記してください。バージョンは例えば、以下のSQLで知ることができます。 select version();

OKIaHUKUOKA
質問者

お礼

すいません。 あらためて試してみたのですが、上記のメッセージの下に下記のようなメッセージも出ていました。 > MySQLのメッセージ --> > > #1170 - BLOB column 'no' used in key specification without a key length >

OKIaHUKUOKA
質問者

補足

phpmyadminで重複していたデータは削除した後で、ユニークキーを設定しようとしたところエラーが出ました。 再度、確認したのですが重複しているデータはありません。 > 具体的には、どんなエラーですか? > 「重複している」というエラーではないでしょうか? > 下記のようなエラーが出ました。 > エラー > 実行した SQL 照会: > > ALTER TABLE `テーブルの名前` ADD UNIQUE ( > > `フィールドの名前` > ); >

関連するQ&A