• ベストアンサー
  • 困ってます

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

  • 質問No.2779815
  • 閲覧数3198
  • ありがとう数3
  • 気になる数0
  • 回答数3
  • コメント数0

お礼率 28% (67/236)

はじめまして。
私のレンタルサーバーには最初からMYSQLというデータベースが付いています。
テーブルを設定して、すでにいくつかのデータを入力しています。
最近、重複して同じIDが入力できることに気づきました。
重複できないようにしたいと思い、調べたところ、ユニークキーというものを設定すれば重複しないらしいと言うことを知りました。

そちらのレンタルサーバーにはすでにPHPMYADMINが使えるようになっています。
PHPMYADMINをつかってIDのフィールドにユニークキーを設定しようとしました。
すると下記のようなエラーがでて、ユニークキーの設定に失敗しました。


> エラー
> 実行した SQL 照会:
>
> ALTER TABLE `テーブルの名前` ADD UNIQUE (
>
> `フィールドの名前`
> );
>

すでにデータが入力されているテーブルのフィールドにはユニークキーは設定できないのでしょうか?
もし、すでにデータが入力されているテーブルのフィールドにユニークキーを設定する方法があったら教えてください。
もしくは私が勘違いをしている部分があったら教えて頂ければ幸いです。

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

  • 回答No.1
  • ベストアンサー

ベストアンサー率 51% (3827/7415)

>すでにデータが入力されているテーブルのフィールドにはユニークキーは
>設定できないのでしょうか?

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

手動もしくはSQLでユニークな状態にもっていかないと
ユニーク設定はできません。
補足コメント
OKIaHUKUOKA

お礼率 28% (67/236)

> 手動もしくはSQLでユニークな状態にもっていかないと
> ユニーク設定はできません。

回答ありがとうございます。
phpmyadminで確認したのですが、重複しているデータはありません。
なのにエラーが出るので困っています。
投稿日時:2007/02/24 15:54

その他の回答 (全2件)

  • 回答No.3

ベストアンサー率 43% (833/1926)

#2回答者です。

> #1170 - BLOB column 'no' used in key specification without a key length

返されたメッセージの通りなのですが?
対象としている列のデータ型は、BLOBですよね?その場合、インデクスを付ける(ユニークにする)には、「列名(キー長)」という形式で指定する必要があります。
つまり、今回の例では、
「alter table `表名` add unique(`列名`(キー長))」
といった指定をする必要があります。
BLOBは非常に長い(大きい)データを格納できる一方で、キーとして扱う部分は長さを指定して限定する必要があるほか、操作も制限されます。

ところで、BLOBに対してユニーク設定をするというのは、非常に珍しい使い方だと思います。BLOBの列は、画像などのバイナリデータを格納することが想定されていますが、列のデータ型の選定は適切に行われているでしょうか?
ユニーク指定が必要な列なら、varchar等が適切だと思いますけど?
お礼コメント
OKIaHUKUOKA

お礼率 28% (67/236)

ありがとうございました。
データ型を「varchar」に変更したところ、ユニークキーが設定できました。

データ型は使い分けの基準がよく分からないので最初、txtに設定してありました。
「大は小を兼ねる」と思っていました。
お手数をおかけしました。
投稿日時:2007/02/26 18:12
  • 回答No.2

ベストアンサー率 43% (833/1926)

データを格納済の状態で、ユニークキーの設定は可能です。ただし、格納データ中に既に重複が存在する状態では、当然、行えません。

>PHPMYADMINをつかってIDのフィールドにユニークキーを設定しよう~
すると下記のようなエラーがでて

具体的には、どんなエラーですか?
「重複している」というエラーではないでしょうか?

以下のような手順で作業する必要があります。
(1)重複データを調査
(2)重複データを削除する等の対策を行う
(3)ユニークキーを設定

(1)重複データの調査
表t1の列c1で、重複している値を調べる場合は、以下のようなSQLで調べられます。
select c1 from t1
group by c1 having count(*)>1;

MySQLのバージョンが示されていませんが、今後も質問する場合は、バージョンを明記してください。バージョンは例えば、以下のSQLで知ることができます。
select version();
補足コメント
OKIaHUKUOKA

お礼率 28% (67/236)

phpmyadminで重複していたデータは削除した後で、ユニークキーを設定しようとしたところエラーが出ました。
再度、確認したのですが重複しているデータはありません。


> 具体的には、どんなエラーですか?
> 「重複している」というエラーではないでしょうか?
>

下記のようなエラーが出ました。

> エラー
> 実行した SQL 照会:
>
> ALTER TABLE `テーブルの名前` ADD UNIQUE (
>
> `フィールドの名前`
> );
>
投稿日時:2007/02/24 15:57
お礼コメント
OKIaHUKUOKA

お礼率 28% (67/236)

すいません。
あらためて試してみたのですが、上記のメッセージの下に下記のようなメッセージも出ていました。


> MySQLのメッセージ -->
>
> #1170 - BLOB column 'no' used in key specification without a key length
>
投稿日時:2007/02/24 16:08
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A

ピックアップ

ページ先頭へ