CREAR ÍNDICE vs ALTERAR TABLA AÑADIR ÍNDICE - ¿MySQLism o SQL Standard?

28

Acabo de encontrar un problema extraño, según el cual, según cómo creo un índice, se requiere un nombre de índice.

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

Me parece que la llamada CREATE INDEX no debe hacer que el nombre de índice sea obligatorio. Me pregunto si esto es un MySQLism o un estándar SQL.

Mike Purcell
fuente

Respuestas:

25

No creo que el estándar SQL defina cómo crear índices en absoluto .

Una cita de esta página de Wikipedia :

Normalización

No existe un estándar sobre la creación de índices porque el estándar ISO SQL no cubre aspectos físicos. Los índices son una de las partes físicas de la concepción de la base de datos, entre otros, como el almacenamiento (espacio de tabla o grupos de archivos). Todos los proveedores de RDBMS ofrecen una sintaxis CREATE INDEX con algunas opciones específicas que dependen de las funcionalidades que brindan a los clientes.

El manual de Postgres parece apoyar esto aquí:

No existen disposiciones para los índices en el estándar SQL.

Más evidencia bajo esta pregunta relacionada sobre SO.

Erwin Brandstetter
fuente
66
MySQL es el único DBMS que conozco que permite agregar un índice explícito usando ALTER TABLE(hay ciertos casos en los que varios DBMS crearán índices implícitos para soportar restricciones, pero eso no es lo que quiero decir).
a_horse_with_no_name
@a_horse_with_no_name: debidamente anotado. No entiendo por qué MySQL nos obliga a pasar un index_name, cuando claramente no puede manejar ningún nombre debajo. Es un PITA verse obligado a hacer una modificación simplemente para evitar nombrar índices.
Mike Purcell
-1

Si no proporciona un nombre para el índice, MySQL nombrará automáticamente el índice por usted.

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;

Las ALTER TABLE ADD INDEXdeclaraciones anteriores producirán los siguientes índices:

  • col1
  • col1_2
  • col2

Si crea un índice con solo una columna, puede que no sea necesario proporcionar un nombre para el índice (ya que el nombre del índice será el mismo que el nombre de la columna). Pero si crea un índice con varias columnas, podría ser mejor proporcionar un nombre para el índice para que sea más fácil identificarlo.

Es una buena práctica proporcionar un nombre para el índice (y agregarle un prefijo idxo algo para identificarlo como índice):

ALTER TABLE my_table ADD INDEX idx_my_column (my_column);

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