こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

SQLのINDEX名

素朴な疑問ですが、教えてください。
SQLのcreate index構文は「create index idx on table(id);」ですが、

そもそも、なぜindex名をこちらが名前を指定するようになっているのでしょうか。
別にシステム側で決めても良い気がします。delete index するときも
列名を指定する仕組みにして、列名に張られたindexを削除する仕組みにすればいいのにと
思います。

よろしくお願いします。

投稿日時 - 2012-11-30 12:05:55

QNo.7822779

困ってます

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

列に対して primary key や unique を指定すれば,システム側で決めたindex名で自動的にindexが作られます。ご指摘のような機能はすでにあるわけです。
http://d.hatena.ne.jp/sternheller/20090717/1247853538

> なぜindex名をこちらが名前を指定するようになっている?

索引がオブジェクトだからでしょう。

> 表も索引もそれぞれ別物として実装しているのですよね。
> 索引を削除せずに,索引を表から切り離すこともできるし,
> 索引を再び表に紐付けることもできる。
> だから,索引はオブジェクトと呼ばれるのが適切なわけです。
http://okwave.jp/qa/q6879675.html の私の回答ANo.5

表に大量の行を挿入する際,索引が付いたままだと処理が遅くなるので,いったん索引を外し → 行を挿入し → 再び索引を付け直す(挿入後の全行に対してまとめて索引を更新し直す)という処理をおこないます。あと,列名というのは決めたが最後 変えられないものではなく,後から変更も可能な名前です。

これらの例を通じてみても,索引というのは指定したある列名にいつも紐付けられている存在ではないですね。

index名が無指定の場合,create index が既定のindex名を与えてくれるような言語仕様にするならするでもいいのですけれど,
ANo.1にもあるように,であるなら,
table名が無指定の場合,create table も既定のtable名を与えてくれる方が,言語仕様として統一が取れていると思います。

投稿日時 - 2012-11-30 13:32:48

お礼

なるほどですね。
回答ありがとうございました

投稿日時 - 2012-12-05 11:23:53

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.2

名前なんて勝手に付けてくれればいいと思うのは小規模なシステムの時だけです。
規模が大きくなるにつれて、システムが勝手に何かを決める事が不整合や競合を起こす原因になるので、設計者がちゃんと決めなければいけません。

投稿日時 - 2012-11-30 13:19:27

お礼

ありがとうございます。参考になりました!

投稿日時 - 2013-04-15 12:33:43

ANo.1

CREATE INDEXは、元テーブルに索引を付加するのではなく「特殊なテーブルとして、索引テーブルを作成する」のです。

index名を指定するのは、CREATE TABLEでtable名を指定するのと同じです。

CREATE TABLEで「名無しのテーブルが作れない」のと同じで、CREATE INDEXでも「名無しの索引は作れない」のです。

テーブルもインデックスも「指定した名前でデータベース上に作成される」ので「作成する限りは名前が必要」なのです。

あと、SQLの構文として「TABLE」と「INDEX」を同列に置いてあった方が判り易い、と言うのもあるでしょう。

CREATE INDEX "インデックス名" ON "テーブル名" (中身)

CREATE TABLE "テーブル名" (中身)

CREATE VIEW "ビュー名" (中身)

CREATE INDEXの「ON "テーブル名"」の部分を「追加的な修飾語」と捉えれば、どのCREATE文も「3つ目は、データベース内に作られるオブジェクト名、括弧の中にフィールド名などの中身を書く」と言う事になり「同一の構文」になっています。

投稿日時 - 2012-11-30 12:50:04

お礼

ありがとうございます。参考になりました!

投稿日時 - 2013-04-15 12:33:49