• 締切済み

Mysqlのconstraintについて教えてください (難題)

回答者がつかなかったので再度。 Q1.単順にKEY指定するのとどこが違うのですか? show indexで見た限り、下記の(1)と(3)の違いが分かりません。 Q2.constraint_nameはどこに行ってしまったのですか? show indexで見ると、unique(it1)で指定した項目it1がそのままインデックス名になります。 constraint_nameで指定した名前はどこに行ったのでしょうか? (1)constraintで定義、インデックス名を指定。 mysql> create table t1 (it1 tinyint(1),constraint constraint_name unique(it1)); (2)UNIQUE KEYで定義、インデックス名を指定。 mysql> create table t2 (it1 tinyint(1),UNIQUE KEY UNIQUE_KEY_NAME (it1)); (3)UNIQUE KEYで定義、インデックス名=Key項目名。 mysql> create table t3 (it1 tinyint(1),UNIQUE KEY it1 (it1));

  • MySQL
  • 回答数4
  • ありがとう数1

みんなの回答

回答No.4

#2,#3回答者です。 MySQLを使う機会があったので、試してみました。 ご質問の件は、ver 4.0~ver 5.0の間に、プログラムが変更されています。 ver 4.0・・・インデクス名として、インデクスの先頭構成列の名前が入る。 ver 5.0・・・インデクス名として、制約名(constraintで指定した名前)が入る。 ver 4.1の日本語マニュアルには、以下のような記載があります。 「PRIMARY KEY でないインデックスに名前を割り当てないと、そのインデックスは index_col_name の最初のカラム名と同じ名前が割り当てられ、そのインデックスを一意(ユニーク)なものとするためのオプションのサフィックス(_2、_3、...)が付けられる。」 制約名がインデクス名になるように、「改善」したのか、「不良として修正」したのかは不明です。

回答No.3

#2回答者です。訂正します。 この場合は、一意性制約でした。 MySQLは、他のRDBMSのように、SQLで定義情報を参照 することはできず、SHOWなどで定義情報の一部しか表示してくれません。

回答No.2

constraintは、参照制約を定義する場合に、関連付けるための名前であり、インデクスとは直接関係しません。 これらの構文で、何を期待しているのでしょうか? SQLの標準仕様を調べてみましたか? インデクス名などに関する規則は、あなたが不信感を持っているかも知れない、マニュアルに記載されています。 あなたは、VARCHAR(n)で、マニュアルの部分的な誤訳を、「マニュアル不備だ!」と声高に叫んで、記載した人ですよね? マニュアルの他の部分の記載と併せて見れば分かる話しだし、他のRDBMSの経験があったり、SQL標準仕様を調べれば、常識の範囲です。 多くの人が、あなたに絡まれて、不愉快な思いをするのが嫌で、回答しなかったのだと想像できます。

webuser
質問者

お礼

>あなたは、VARCHAR(n)で、マニュアルの部分的な誤訳を、「マニュアル不備だ!」と声高に叫んで、記載した人ですよね? >マニュアルの他の部分の記載と併せて見れば分かる話しだし、他のRDBMSの経験があったり、SQL標準仕様を調べれば、常識の範囲です。 > >多くの人が、あなたに絡まれて、不愉快な思いをするのが嫌で、回答しなかったのだと想像できます。 VARCHAR(n)の部分は、マニュアルの部分的な誤訳であり不備である事は事実です。 そして不備である事を擁護したり、隠蔽する事が必ずしも正しいとは思っていません。 「ここに落とし穴があるよ」と解かる手掛かりを残す方が後の人の為ともいえます。 また、特定の誰かに絡んだ事はありません。 議論は人に向けて出なく題目に対して正しいと思った事を書いているのでこの掲示板の主旨にも反していません。 特定の(この場合私ですが)誰かの過去レスを曝したりする事こそ「絡む」という言葉が当て嵌まります。 「マニュアルに記載されています」それはそうかもしれません。 しかし、その理屈は法律の事を相談したら「六法全書に書いてるでしょ」で済ますのと同じで人を不快にしかしません。 お気をつけ下さい。 管理者の方> このスレは趣旨に反するなら消しても構いませんので。

回答No.1

難しく考えると解らなくなりますが・・ SQLの互換性維持のため、受付可能な方便と捉えるのが 良いかと思います。 MySQLでは、constraint_nameがノイズワード扱いだと思いますよ。

関連するQ&A

  • 複数テーブルで 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) スペースが詰まって読みづらい箇所もありますが、よろしくお願いします。

  • エラーになってしまうCREATE文

    MySQL 5.0.21(Win版)を導入してみたのですが、 http://hotwired.goo.ne.jp/webmonkey/2000/01/index2a_page5.html にある下記のSQL文を「MySQL Command Line Client」から実行すると CREATE TABLE employees ( id tinyint(4) DEFAULT '0' NOT NULL AUTO_INCREMENT, first varchar(20), last varchar(20), address varchar(255), position varchar(50), PRIMARY KEY (id), UNIQUE id (id)); を実行すると、 mysql> CREATE TABLE employees ( id tinyint(4) DEFAULT '0' NOT NULL AUTO_INCREMEN T, first varchar(20), last varchar(20), address varchar(255), position varchar(5 0), PRIMARY KEY (id), UNIQUE id (id)); ERROR 1067 (42000): Invalid default value for 'id' mysql> とエラーになってしまいます。なぜでしょうか?

    • ベストアンサー
    • MySQL
  • UNIQUE KEY user_name_inde

    サンプルのCREATE TABLE文 の中に、 UNIQUE KEY user_name_index(user_name) とあったのですが、意味を教えてください。  自分で調べた限りは、UNIQUEというのはあったのですが、  UNIQUE KEY が見つかりませんでした。  UNIQUE KEY は、UNIQUEと同義なのでしょうか?  あるいは、こういう書き方があるのでしょうか?  また、CREATE TABLEの中で、user_nameカラムを作成しているのですが、  user_name_index(user_name)では、何をしているのでしょうか?  user_name_indexと別の名前でUNIQUE KEYに設定しているのでしょうか?  それとも、_indexとついてるので、  この書き方だけで、ユニークインデックスなるものにしているのでしょうか?

    • ベストアンサー
    • MySQL
  • インデックスの削除と、インデック名のつけ方について

    PostgreSQL8.2.24を使っています。 インデックスの削除と、インデック名のつけ方についてお聞きしたいです。 まず、削除ですが、create index tbl_fld_key on tbl (fld); としたものは、drop index tbl_fld_key;で削除できますが、 create tbl ( fld integer, unique key (fld) ); としたものは、drop index tbl_fld_keyで削除できません。 インデックス名は\diコマンドで表示されている tbk_fld_keyです。 メッセージは次のとおりです。 db =# drop index tbl_fld_key; ERROR: cannot drop index tbl_fld_key because constraint tbl_fld_key on table tbl requires it HINT: You may drop constraint tbl_fld_key on table tbl instead. あと、PostgreSQLのインデック名の規則について インデックス名を見ただけで判断できるように作られるようですが PRIMARY KEY テーブル名_フィールド名_pkey UNIQUE    テーブル名_フィールド名_key 重複可    テーブル名_フィールド名_??? <<--- この部分が知りたいです。

  • constraint と index の違い

    ALTER TABLE distributors ADD CONSTRAINT dist_id_zipcode_key UNIQUE (dist_id, zipcode); CREATE UNIQUE INDEX dist_id_zipcode_key ON distributors (dist_id, zipcode); この二つには違いがあるのでしょうか。

  • Oracleの制約構文に関して

    Oracleの外部キー(参照整合性)制約に関して質問です。 定義済みの列制約に対して、追加の定義方法がわかりません。 CREATE TABLE TMP (T_COL1 NUMBER(4) CONSTRAINT PK_COL1 PRIMARY KEY, T_COL2 VARCHAR2(10) CONSTRAINT U_COL2 UNIQUE, T_COL3 NUMBER(2) CONSTRAINT FK_COL3 REFERENCES EMP(E_COL1) ); 上記のSQL文を実行した後にT_COL3の制約に"ON DELETE CASCADE" を追加する方法を教えて頂けますでしょうか?

  • MySQLのUNIQUE INDEXとINDEX

    MySQLのUNIQUE INDEXとINDEXの使い分けで質問があります。 UNIQUE INDEXは、社員番号や学籍番号など重複がないものに対して使われ、 INDEXは名前のように重複が想定されるものに対して使われるのでしょうか? また、複数のカラムに同一のインデックスをつける場合、 CREATE INDEX idx_名前 ON 社員(氏,名) と言う感じになりますが 例えばこんなコード CREATE INDEX idx_名前 ON 社員(氏) and CREATE INDEX idx_名前 ON 社員(名) これはエラーになるんでしょうか?

    • ベストアンサー
    • MySQL
  • Oracleでテーブルを作成する際に、インデクスの作成先を指定したい。

    以下のようにテーブルを作成しようとしてます。 CREATE TABLE TEST_USER.M_USER ( ID char(4), NAME varchar2(40) NOT NULL), CONSTRAINT PK_USER PRIMARY KEY(ID) ); さて、プライマリキーを定義しているので、インデクスが作成されるはずです。 この作成先のテーブルスペースを指定したいのですが、方法が解りません。 CREATE TABLEの紹介をしているサイトにものっていなくて、途方にくれています・・・。 CONSTRAINT句を使えばいいのでしょうか?

  • mysqlのインデックスについて質問です。

    mysqlのインデックスについて質問です。 http://archiva.jp/web/server-side/sql_02.html に、 『mysqlでは1つのクエリ実行で、1つのテーブルにつき1つのインデックスしか使用できない』 とあります。 よく以下のようなテーブル定義を見かけますが、 CREATE TABLE IF NOT EXISTS `data` ( `id` int(10) NOT NULL default '0', `user_id` int(10) NOT NULL default '0', `file_id` int(10) NOT NULL default '0', `name` text collate utf8_unicode_ci NOT NULL default '', PRIMARY KEY (`id`), KEY `user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; idとuser_idを条件にするクエリであれば、上記制約を満たすため、 KEY `id_user_id_idx` (`id`,`user_id`) の複合クエリを定義すれば良いのでしょうか? また、idとuser_idとfile_idを条件にするクエリも考慮に入れた場合、 テーブル定義は以下のようにするのでしょうか? CREATE TABLE IF NOT EXISTS `data` ( `id` int(10) NOT NULL default '0', `user_id` int(10) NOT NULL default '0', `file_id` int(10) NOT NULL default '0', `name` text collate utf8_unicode_ci NOT NULL default '', PRIMARY KEY (`id`), KEY `user_id` (`user_id`), KEY `id_user_id_idx` (`id`,`user_id`), KEY `id_user_id_file_id_idx` (`id`,`user_id`,`file_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 最後に、create table 時のインデックスの指定は、 INDEX `user_id` (`user_id`), のようにもできますが、INDEXとKEYの違いは何かあるのでしょうか。

    • ベストアンサー
    • MySQL
  • uniqueキーをupdateで+1するとERROR 1062: Duplicate entry になる

    create table table1 ( a tinyint unsigned not null, b tinyint unsigned not null, unique index_table1 ( a, b ) ); insert into table1 values('1','1'); insert into table1 values('1','2'); update table1 set b = b+1 where a = '1'; とすると、 ERROR 1062: Duplicate entry '1-2' for key 1 とエラーになってしまいます。 どうやら unique の制約に引っかかっているみたいです。 結果としては 1,2 1,3 になればいいのですが、一個一個bが多い順番にSQLを発行するか、unique 制約を外すしかないんでしょうか? (面倒なので、一発でやりたいのです)

    • ベストアンサー
    • MySQL