Eu tenho uma tabela específica para um dos meus pacotes de software em uma caixa MySQL 5.1 que preciso descartar algumas centenas de entradas. Estes são nomes de usuário com nomes em maiúsculas, o aplicativo é específico do caso e espera letras minúsculas. No entanto, esta tabela é referenciada por uma tonelada de outras tabelas, algumas das quais podem ter referências a esses usuários.
Existe uma maneira pronta de ajustar as chaves estrangeiras para todas as tabelas em meu banco de dados que fazem referência a uma determinada coluna 'nome de usuário' na tabela 'logins' para ter o atributo on delete cascade definido? Não vejo uma maneira pronta de fazer isso.
O que eu preciso é alterar todas as outras tabelas com chaves estrangeiras dependendo desta tabela para utilizar uma cascata on delete. Espero fazer isso sem alterar manualmente cem tabelas.
O select que estou utilizando é
delete from user where user_name REGEXP '^.*[A-Z].+$';
O problema é que o aplicativo criou IDs de usuário duplicados no campo user_id. Eu só quero manter o número de ID para nomes de usuários criados corretamente.
A seleção acima visa exatamente o que eu quero me livrar. Não tenho acesso à fonte do aplicativo que criou essas entradas.
AVISO !!!
Antes de fazer qualquer coisa, mysqldump todo o banco de dados ou tarball /var/lib/mysql
Se você está preocupado com a diferenciação de maiúsculas e minúsculas, precisa procurar os nomes de usuário de uma maneira especial
Eu tentei esta pequena experiência
Eu carreguei os dados de amostra
Eu executei essas consultas (observe as diferenças sutis)
Dê esta visão do meu experimento, um nome de usuário com todas as letras maiúsculas ou mistas pode ser igual a todas as letras minúsculas, A MENOS QUE VOCÊ USE
BINARY
o operador com a comparaçãoEu não acho que
BINARY
pode ser aplicado aON DELETE CASCADE
.No entanto, você pode fazer algo assim: Para excluir todos os nomes de usuário apenas em minúsculas, tente executar um dos seguintes procedimentos:
ou
Se você executar isso agora, poderá eliminar todos os nomes de usuário nas outras tabelas. Execute isso em vez disso
ou
Você terá que ir a todas as tabelas que possuem um nome de usuário e executar
Como você tem várias outras tabelas, use o INFORMATION_SCHEMA para fazer o script para você:
Se o arquivo estiver correto para você, execute-o no cliente mysql assim
De uma chance !!!
Se você realmente precisar criar novas linhas, terá que executar UPDATE em cada linha dependente em cada tabela e definir a chave estrangeira na linha dependente para o ID da nova linha na tabela de logins.
Não sei por que é necessário excluir essas linhas que possuem dados que as referenciam.
Por que não?
Acho que há outras opções aqui além de destruir dados.
Se, por acaso, o único uso desta tabela for logins E o nome de usuário não for o FK na tabela dependente, você poderá executar:
Isso deixará o conteúdo em conformidade com o aplicativo, mas deixará o PK ID intacto