• ベストアンサー

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

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

  • MySQL
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • 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

  • MYSQLのフィールドにユニークキーを設定する。

    すでに作ってしまったテーブルにユニークキーを付けたいと考えています。最悪の場合、新しくカラムを作っての追加でもかまわないのですが、いろいろ試してもエラーが返されてしまいます。 codeというカラムにユニークキーを設定したいのですが、 alter table テーブル名 modify unique code; alter table テーブル名 add unique code2; alter table テーブル名 modify code unique; alter table テーブル名 add code2 unique; alter table テーブル名 modify code test unique; alter table テーブル名 add code2 test unique; alter table テーブル名 modify unique code test; alter table テーブル名 add unique code2 test; alter table テーブル名 modify (code unique); alter table テーブル名 add (code2 unique); alter table テーブル名 modify (code text unique); alter table テーブル名 add (code2 text unique); など、思いつく限り試し、グーグルで調べる限り調べたのですが、出てきたものをためしてもダメでした。 テーブルを作成した後、カラムにユニークキーを設定した経験のある方、どのように変更をしたのでしょうか?

    • ベストアンサー
    • MySQL
  • 重複なしのフィールドにつき、重複データ挿入時上書きする設定は?

    こんにちは。 主キーないしユニークキーなどで、 重複しない設定にしたフィールドで、 重複データを入力されたとき、 入力できないのではなく、上書きされる、 設定にしたいのですが、 どのような方法が、あるでしょうか。 (いちいち、古いデータを削除しなければ、 ならないのでしょうか。) お願いします。

  • MySQLで、テーブル内のフィールドの名前を変えたいのですが・・・

    MySQL4.0.20 Linuxを使っています。 テーブル内のフィールドの名前を変えたいのですが、alter table の modifyはカラムの属性を変えるもので、名前を変えるのは運用途中でできるのかなと、ふと疑問に思いました。 alter tableなどでできるのでしょうか? 結局サーバーを止めて、バックアップし、テーブル定義を書き直して、リストアするしか無いのでしょうか?

    • ベストアンサー
    • MySQL
  • 重複を許すキーの構文がわかりません。

    データベース自体はPostgreSQLを使っています。そして、アクセス2003を使って、テーブルリンクで閲覧しています。 あるフィールドに検索が早くなるようにキーを設けたいのですが、 重複を許すキーの構文がわかりません。 PRIMARY KEY, UNIQUEの設定はわかるのですが、 どのように記述すればよいのでしょうか? 以下、アクセスのプロパティです。 インデックス ●いいえ デフォルト、無指定 ●はい(重複あり)[***** ここの部分のSQLが知りたい *****] ALTER TABLE テーブル名 ADD ???????? (フィールド); ●はい(重複なし)UNIQUE もしくは値要求混みのPRIMARY KEY ALTER TABLE テーブル名 ADD UNIQUE (フィールド); ALTER TABLE テーブル名 ADD PRIMARY KEY (フィールド);

  • Oracleのテーブルのフィールドを削除したい

    「総務部.受付ID-1」というフィールドを削除したいと思い以下を実行しました。 alter table VISITOR_SCHDULE drop 総務部.受付ID-1 しかしキーワードがありませんというエラーが表示されてしまいます。 フィールド名に.(ドット)と-(ハイフン)が使用されているからなのでしょうか? 前任者より引継ぎましたので、なぜこのようなフィールド名にしたかは不明です。

  • テーブルを再編集するには

    PostgreSQL7.1.3 RedHatLinux7.2 create table でtestというテーブルを作りまして、ID、nameというフィールドを作り、主キーをIDに設定しました。このテーブルにtelというフィールドを追加したいのですが、テーブルを編集するコマンドがわかりません。 また、testテーブルにいつくかデータを入力したのですが、そのデータがちゃんと入っているかどうか確認するコマンドも知りたいです。 宜しくお願いします!

  • 別のテーブルのフィールドを抽出項目にするには?

    別のテーブルのフィールドを抽出項目にするには? Access初心者です。 申し訳ありませんが、急ぎ回答いただきたく思います。 どうか宜しくお願いいたします。 お伺いしたい内容は、 データが多く、抽出条件も多いので、 別のテーブルのフィールドに入っている単語を使い、 抽出したい元データのレコードをあいまい検索して非表示にしたいです。 データの内容は下記になります。 --------------------------------------- 元データ(テーブル1とテーブル2から結合したクエリ(名前は元データ) フィールド1 フィールド2 ID-1     りんご ID-2     バナナ ・       ・ ・       ・ ・       ・ ID-2000    チェリー --------------------------------------- --------------------------------------- 除外リスト(テーブル3。名前は除外リスト) フィールド1 りんご チェリー ・ ・ ・ --------------------------------------- 元データのフィールド2に Not Like "*りんご*" And Not Like "*チェリー*" と記述すれば、フィールド2にりんご、チェリーを含むレコード以外のものが表示され、 欲しい情報が手に入るのですが、(上記例だとバナナのみ表示される) 実際にはりんご、チェリーなどあいまい検索し、非表示にしたいキーワードが100個あります。 なので、除外リストというテーブルをつくり、 そのフィールド内に書かれたキーワードを使い Not Like "*りんご*" And Not Like "*チェリー*" と同じような表示結果になるようにしたいのですが、 やり方が調べてもどうしてもわかりません。 どうか皆様のお力を貸してください。 宜しくお願いいたします。

  • フィールドの設定

    よろしくお願いします。 かねやんMySQLでデータベースを作成、PHPで作成したフォームからデータを書き込みしたいです。 ほぼ出来上がっていますが、データの書き込みが最初の1件のみで2件目からが入りません。 テーブルに「ID」というフィールドを作成(連番にしたい)しているのですが、以下の設定をしました。 ・データ型 smallint ・データ長 4 ・プライマリーキー、UNSIGNEDにチェック 他は何も設定していません。 作成後にテーブルを編集画面で確認すると、デフォルトに「0」が入った状態になります。 おそらくこれが原因だと思うのですが、どのようにすればデフォルト値をなしにして連番が振れるのでしょうか?

    • ベストアンサー
    • MySQL
  • テーブルの中身を違うテーブルへコピー

    お世話になります。 SQLについて質問があるのですが・・・。 Aというテーブルがあり、何件かデータが入っています。 そのAテーブルにフィールドを2つ新たに追加したいのです。 ALTER TABLEは使わずに、 以下の様な操作をしたいと考えております。 1:Aテーブルを違う名前に変更。  もしくはテーブルを丸々コピー。 2:テーブルBを作成。   (テーブルAのフィールドに2つフィールド追加した内容) 3:テーブルBにテーブルAの内容を丸々コピー。   その際、新規に追加した2つのフィールドには、初期値として、何かの文字or数字を入れる。 4:Aテーブルを削除 と、いう感じです。 作成はINSERT、削除はDROPを使えばいいのかなーって 思っているのですが、 テーブル名の変更や、テーブルの内容のコピーが ちょっと分かりません。 上記について、ご教授の程、よろしくお願いします。 なお、DBにはSQL Serverを使用しています。

  • 複数テーブルで ID の一意性を保つ

    Debian GNU/Linux 3.1 で psql 8.1.2 を使用しています。 下記の要領でテーブルを作成し、2つのテーブルでIDが重ならないようにしようと意図しました。 CREATE TABLE t1 ( t1_id int2 UNIQUE NOT NULL, t1_name text NOT NULL ); NOTICE: CREATE TABLE / UNIQUE will create implicit index "t1_t1_id_key" for table "t1" CREATE TABLE CREATE TABLE t2 ( t2_id int2 UNIQUE NOT NULL, t2_name text NOT NULL ); NOTICE: CREATE TABLE / UNIQUE will create implicit index "t2_t2_id_key" for table "t2" CREATE TABLE CREATE FUNCTION unique_t12_id(int2) RETURNS BOOLEAN AS 'SELECT NOT ( EXISTS(SELECT * FROM t1 WHERE t1_id = $1) AND EXISTS(SELECT * FROM t2 WHERE t2_id = $1) );' LANGUAGE SQL; CREATE FUNCTION ALTER TABLE t1 ADD CONSTRAINT con_unique_t12 CHECK (unique_t12_id(t1_id)); ALTER TABLE ALTER TABLE t2 ADD CONSTRAINT con_unique_t12 CHECK (unique_t12_id(t2_id)); ALTER TABLE ところが実際は上手くいきませんでした。 INSERT INTO t1 VALUES(1, 'test1'); INSERT 0 1 INSERT INTO t2 VALUES(2, 'test2'); INSERT 0 1 INSERT INTO t2 VALUES(2, 'test3'); ERROR: duplicate key violates unique constraint "t2_t2_id_key" # ここまでは期待通りの挙動です INSERT INTO t2 VALUES(1, 'test4'); INSERT 0 1 ここで制約が働いて欲しかったのですが、素通りでINSERTされています。 下記のように、操作後の関数の戻り値は「偽」なのでこの操作は制約に引っかかると思うのですが 何故意図したように動かないのでしょうか。 SELECT *,unique_t12_id(t2_id) FROM t2; t2_id | t2_name | unique_t12_id -------+---------+--------------- 2 | test2 | t 1 | test4 | f (2 rows) スペースが詰まって読みづらい箇所もありますが、よろしくお願いします。