CRIAR INDEX vs ALTER TABLE ADD INDEX - MySQLism ou SQL Standard?

28

Acabei de encontrar um problema estranho, pelo qual, dependendo de como eu crio um índice, é necessário um nome 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

Parece-me que a chamada CREATE INDEX não deve exigir o nome do índice. Gostaria de saber se este é um MySQLism, ou um padrão SQL?

Mike Purcell
fonte

Respostas:

25

Eu não acho que as SQL padrão define como criar índices em tudo .

Uma citação desta página da Wikipedia :

estandardização

Não há um padrão sobre a criação de índices porque o ISO SQL Standard não cobre aspectos físicos. Os índices são uma das partes físicas da concepção do banco de dados, entre outros, como armazenamento (espaço de tabela ou grupos de arquivos). Todos os fornecedores de RDBMS fornecem uma sintaxe CREATE INDEX com algumas opções específicas que dependem das funcionalidades que eles fornecem aos clientes.

O manual do Postgres parece apoiar isso aqui:

Não há provisões para índices no padrão SQL.

Mais evidências sob esta questão relacionada ao SO.

Erwin Brandstetter
fonte
6
O MySQL é o único DBMS que conheço que permite adicionar um índice explícito usando ALTER TABLE(existem certos casos em que índices implícitos serão criados por vários DBMS para suportar restrições, mas não é isso que eu quero dizer).
A_horse_with_no_name 18/07/2013
@a_horse_with_no_name: devidamente anotado. Eu não entendo por que o MySQL nos obriga a passar um index_name, quando claramente ele não pode lidar com nenhum nome embaixo. É uma PITA ser forçada a fazer uma alteração simplesmente para evitar nomear índices.
Mike Purcell
-1

Se você não fornecer um nome para o índice, o MySQL nomeará automaticamente o índice para você.

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;

As ALTER TABLE ADD INDEXdeclarações acima produzirão os seguintes índices:

  • col1
  • col1_2
  • col2

Se você criar um índice com apenas uma coluna, talvez não seja necessário fornecer um nome para o índice (já que o nome do índice será o mesmo que o nome da coluna). Mas se você criar um índice com várias colunas, talvez seja melhor fornecer um nome para o índice, para que seja mais fácil identificá-lo.

É uma boa prática fornecer um nome para o índice (e prefixá-lo idxou algo para identificá-lo como um índice):

ALTER TABLE my_table ADD INDEX idx_my_column (my_column);

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