CREATE INDEX vs ALTER TABLE ADD INDEX - MySQLism oder SQL Standard?

28

Ich bin gerade auf ein seltsames Problem gestoßen, bei dem je nachdem, wie ich einen Index erstelle, ein Indexname erforderlich ist.

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

Es scheint mir, dass der CREATE INDEX-Aufruf den Indexnamen nicht erforderlich machen sollte. Ich frage mich, ob dies ein MySQLism oder ein SQL-Standard ist?

Mike Purcell
quelle

Antworten:

25

Ich glaube nicht, dass der SQL-Standard definiert, wie Indizes überhaupt erstellt werden .

Ein Zitat aus dieser Wikipedia-Seite :

Standardisierung

Es gibt keinen Standard zum Erstellen von Indizes, da der ISO-SQL-Standard keine physischen Aspekte abdeckt. Indizes sind einer der physischen Bestandteile der Datenbankkonzeption, unter anderem der Speicher (Tablespace oder Dateigruppen). RDBMS-Anbieter geben alle eine CREATE INDEX-Syntax mit einigen spezifischen Optionen an, die von den Funktionen abhängen, die sie den Kunden zur Verfügung stellen.

Das Postgres-Handbuch scheint dies hier zu unterstützen:

Es gibt keine Bestimmungen für Indizes im SQL-Standard.

Weitere Beweise unter dieser verwandten Frage zu SO.

Erwin Brandstetter
quelle
6
MySQL ist das einzige mir bekannte DBMS, mit dem ein expliziter Index hinzugefügt werden kann ALTER TABLE(es gibt bestimmte Fälle, in denen implizite Indizes von verschiedenen DBMS erstellt werden, um Einschränkungen zu unterstützen, aber das meine ich nicht).
a_horse_with_no_name
@a_horse_with_no_name: Ordnungsgemäß vermerkt. Ich verstehe nicht, warum MySQL uns zwingt, einen Indexnamen zu übergeben, obwohl es offensichtlich keinen Namen darunter verarbeiten kann. Es ist eine PITA, gezwungen zu sein, eine Änderung vorzunehmen, nur um die Benennung von Indizes zu vermeiden.
Mike Purcell
-1

Wenn Sie keinen Namen für den Index angeben, benennt MySQL den Index automatisch für Sie.

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;

Mit den ALTER TABLE ADD INDEXobigen Anweisungen werden die folgenden Indizes erstellt:

  • col1
  • col1_2
  • col2

Wenn Sie einen Index mit nur einer Spalte erstellen, ist es möglicherweise nicht erforderlich, einen Namen für den Index anzugeben (da der Name des Index dem Namen der Spalte entspricht). Wenn Sie jedoch einen Index mit mehreren Spalten erstellen, ist es möglicherweise besser, einen Namen für den Index anzugeben, damit der Index leichter identifiziert werden kann.

Es hat sich bewährt, einen Namen für den Index anzugeben (und diesen mit einem Präfix zu versehen idxoder ihn als Index zu kennzeichnen):

ALTER TABLE my_table ADD INDEX idx_my_column (my_column);

-- or
CREATE INDEX idx_my_column ON my_table (my_column);
kimbaudi
quelle