• 締切済み

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));

みんなの回答

回答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がノイズワード扱いだと思いますよ。