Existe uma maneira de criar um índice no MySQL se ele não existir?
MySQL não suporta o formato óbvio:
CREATE INDEX IF NOT EXISTS index_name ON table(column)
ERROR 1064 (42000): You have an error in your SQL syntax;...
A versão do MySQL ( mysql -V
) é 5.1.48, mas acho que o MySQL não tem essa CREATE INDEX IF NOT EXIST
capacidade em todas as suas versões.
Qual é a maneira correta de criar um índice somente se ele ainda não existir no MySQL?
Essa funcionalidade não existe. Há duas coisas a ter em mente:
Crie o índice de qualquer maneira
Você pode gerar o índice de forma que o índice seja criado sem verificar se o índice existe antecipadamente. Por exemplo, você pode executar o seguinte:
Isso definitivamente criará dois índices sem verificação. Cada índice receberá um nome (talvez column_to_index,column_to_index_1). Claro, você está tentando evitar isso.
Verifique o INFORMATION_SCHEMA primeiro
Aqui está o layout de INFORMATION_SCHEMA.STATISTICS:
Você pode apenas consultar a existência do índice pelo nome. Por exemplo, antes de executar
Você precisa correr
Se IndexIsThere for 0, você poderá criar no índice. Talvez você possa escrever um procedimento armazenado para criar um índice na tabela de sua escolha.
Aqui está um exemplo de execução (Ei, lembra desta tabela? É da pergunta que você fez em 27 de junho de 2012 ):
De uma chance !!!
Eu tenho algo semelhante com o uso
SELECT IF()
da instrução no MySQL se você estiver tentando não ter procedimentos:Aqui o
select if
tem esse formatoif (condition, true_case, false_case)
. Oselect 'index index_1 exists'
é um caso fictício. E o_____
desempenha o papel de nome de alias. Se o alias não for feito, o nome da coluna e a linhaindex index_1 exists
serão exibidos, o que confundiria ainda mais. Para ser mais descritivo, você pode usar'select ''index index_1 exists'' as _______;'
.Se você nomear o índice, a consulta falhará se o índice já existir (testado no MySQL 8.0):
Então você pode simplesmente pegar a exceção e ignorá-la, por exemplo em PHP:
Minha consulta lhe daria a contagem de índices presentes em uma tabela com um determinado index_name. Com base nessa contagem, você pode decidir se deve emitir um
CREATE INDEX
comando ou não.Testado no MySQL versão 5.5 .
MariaDB suporta
IF NOT EXISTS
sintaxe . Você pode usarCREATE INDEX IF NOT EXISTS
lá.