Como posso determinar se uma determinada coluna em uma tabela MySQL é sempre SELECTed ou explicitamente UPDATEd ou INSERTed ou referenciada em uma cláusula WHERE? Seria bom se eu pudesse determinar o usuário db que está usando a coluna também.
Isso está no MySQL 5.0, mas eu poderia movê-lo para 5.6 ou 5.7.
Histórico: estou mantendo um aplicativo herdado com um campo AUTOINCREMENT ( "id"
) que, previsivelmente, atingirá seu valor INT máximo antes que o aplicativo seja desativado.
Eu suspeito, mas não sei, que ninguém realmente faz referência a esse campo no SQL. Idealmente, eu "monitoraria" a coluna por uma ou duas semanas e, se não aparecesse em nenhuma consulta, transformaria em BIGINT ou descartaria em favor de uma chave natural. Se a coluna aparecer nas consultas de alguém, precisarei rastrear essa pessoa e coordenar a mudança.
Cuidado com o vão
Deixe-me dar uma terceira opção se os IDs tiverem muitas lacunas...
Uma causa significativa de "ficar sem valores de id" são as consultas que deixam lacunas nos
AUTO_INCREMENT
valores. UmaINSERT
instrução em que a linha não é inserida primeiro aloca um valor de aumento automático e, em seguida, falha em usá-lo.INSERT IGNORE
fará isso silenciosamente.Às vezes, uma solução alternativa útil é alterar o código de forma que ele não faça o
INSERT
que se não for bem-sucedido. A normalização é talvez um caso normal para isso. Aqui está uma técnica para normalização de lote que evita o problema .(OK, esta sugestão não é útil se você não conseguir acessar o código-fonte. Mas pode ser útil para outros leitores; já me salvou algumas vezes.)
Registro geral
Ao ativar o "log geral" por um período de tempo, você pode coletar todas as consultas. Então você pode procurar a tabela ou "id", etc. Será tedioso. Não será 100% seguro, pois algumas consultas podem não ter sido executadas nesse período.
innodb_autoinc_lock_mode
innodb_autoinc_lock_mode
não existia até 5.5, então isso não é uma opção.(Mais uma vez, menciono isso para outros leitores.)