CREATE INDEXとALTER TABLE ADD INDEX-MySQLism、またはSQL Standard?


28

奇妙な問題に出くわしました。これにより、インデックスの作成方法によっては、インデックス名が必要になります。

http://dev.mysql.com/doc/refman/5.5/en/create-index.html

http://dev.mysql.com/doc/refman/5.5/en/alter-table.html

CREATE INDEX `random_name` ON `my_table` (`my_column`); # Requires an index name

ALTER TABLE `my_table` ADD INDEX (`my_column`); # Does not require an index name

CREATE INDEX呼び出しでは、インデックス名が必要にならないように思われます。これがMySQLismなのかSQL標準なのか疑問に思っていますか?

回答:


25

SQL標準ではインデックスの作成方法まったく定義されていないと思います。

このウィキペディアのページからの引用:

標準化

ISO SQL標準は物理的な側面をカバーしていないため、インデックスの作成に関する標準はありません。インデックスは、ストレージ(テーブルスペースまたはファイルグループ)などのデータベース概念の物理的な部分の1つです。RDBMSベンダーはすべて、顧客に提供する機能に依存する特定のオプションを持つCREATE INDEX構文を提供します。

Postgresマニュアルはここでこれをサポートしているようです:

標準SQLにはインデックスに関する規定はありません。

SOに関するこの関連する質問に基づくさらなる証拠。


6
MySQLは私が知っている唯一のDBMSであり、これを使用して明示的なインデックスを追加できますALTER TABLE(制約をサポートするためにさまざまなDBMSによって暗黙的なインデックスが作成される特定のケースがありますが、それは私が言うことではありません)。
a_horse_with_no_name

@a_horse_with_no_name:正式に言及しました。MySQLがindex_nameを渡すように強制する理由がわかりませんが、明らかに下の名前を処理できません。インデックスの命名を避けるために、単に変更を強制するのはPITAです。
マイクパーセル

-1

インデックスの名前を指定しない場合、MySQLは自動的にインデックスに名前を付けます。

ALTER TABLE my_table ADD INDEX (col1);
ALTER TABLE my_table ADD INDEX (col1, col2);
ALTER TABLE my_table ADD INDEX (col2);

SHOW INDEX FROM my_table;

上記のALTER TABLE ADD INDEXステートメントは、次のインデックスを作成します。

  • col1
  • col1_2
  • col2

1つの列のみでインデックスを作成する場合、インデックスの名前を指定する必要はないかもしれません(インデックスの名前は列名と同じになるため)。ただし、複数の列を持つインデックスを作成する場合は、インデックスの名前を指定して、インデックスを識別しやすくすることをお勧めします。

インデックスの名前を指定することをお勧めします(プレフィックスとして、idxまたはインデックスとして識別するための何かを追加します):

ALTER TABLE my_table ADD INDEX idx_my_column (my_column);

-- or
CREATE INDEX idx_my_column ON my_table (my_column);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.