CRÉER INDEX vs ALTER TABLE AJOUTER INDEX - MySQLism ou SQL Standard?

28

Je viens de rencontrer un problème étrange, selon lequel, selon la façon dont je crée un index, un nom d'index est requis.

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

Il me semble que l'appel CREATE INDEX ne devrait pas rendre le nom d'index requis. Je me demande s'il s'agit d'un MySQLism ou d'un standard SQL?

Mike Purcell
la source

Réponses:

25

Je ne pense pas que la norme SQL définisse comment créer des index du tout .

Une citation de cette page Wikipedia :

Standardisation

Il n'y a pas de norme sur la création d'index car la norme ISO SQL ne couvre pas les aspects physiques. Les index sont l'une des parties physiques de la conception de la base de données, entre autres comme le stockage (tablespace ou groupes de fichiers). Les fournisseurs de SGBDR donnent tous une syntaxe CREATE INDEX avec certaines options spécifiques qui dépendent des fonctionnalités qu'ils fournissent aux clients.

Le manuel Postgres semble soutenir ceci ici:

Il n'y a aucune disposition pour les index dans la norme SQL.

Plus de preuves sous cette question connexe sur SO.

Erwin Brandstetter
la source
6
MySQL est le seul SGBD que je connaisse qui permet d'ajouter un index explicite en utilisant ALTER TABLE(il y a certains cas où des index implicites seront créés par divers SGBD pour supporter les contraintes, mais ce n'est pas ce que je veux dire).
a_horse_with_no_name
@a_horse_with_no_name: dûment noté. Je ne comprends pas pourquoi MySQL nous oblige à passer un index_name, alors clairement qu'il ne peut gérer aucun nom en dessous. C'est un PITA à être forcé de faire un changement simplement pour éviter de nommer les indices.
Mike Purcell
-1

Si vous ne fournissez pas de nom pour l'index, MySQL nommera automatiquement l'index pour vous.

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;

Les ALTER TABLE ADD INDEXinstructions ci-dessus produiront les index suivants:

  • col1
  • col1_2
  • col2

Si vous créez un index avec une seule colonne, il peut ne pas être nécessaire de fournir un nom pour l'index (car le nom de l'index sera le même que le nom de la colonne). Mais si vous créez un index avec plusieurs colonnes, il peut être préférable de fournir un nom pour l'index afin qu'il soit plus facile d'identifier l'index.

Il est recommandé de fournir un nom pour l'index (et de le préfixer avec idxou quelque chose pour l'identifier en tant qu'index):

ALTER TABLE my_table ADD INDEX idx_my_column (my_column);

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