Usuário com melhor resposta
Registros sem ligação a outra tabela

Pergunta
-
Galera, estou com o seguinte problema e acho que de repente isso poderá ser solucionado num comando SQL.
Eu tenho uma tabela codigo numa tabela x e outro campo codigo na tabela y, a tabela x seria a principal.
A tabela x seria curriculum_pessoal, a tabela y seria curriculum_informatica, ambos tem o campo codigo e o campo codigo na tabela curriculum_informatica tem o codigo da tabela curriculum_pessoal.
Na programação, quando deletava um usuario, estava deletando apenas do curriculum_pessoal e a tabela curriculum_informatica ficava com sujeira e como o banco de dados ficou gigantesco, precisaria de deletar todos do curriculum_informatica que o codigo desse campo não tenha no campo curriculum_pessoal.
Acho que deu pra entender, o resto das outras tabelas seguem a mesma lógica, e essas outras tabelas são mais pesadas ainda, são mais de 40 mil registros
Respostas
-
Boa Tarde,
É possível fazer a "limpeza" em um só comando:
DELETE FROM curriculum_informatica As I WHERE NOT EXISTS (SELECT * FROM curriculum_pessoal As P WHERE I.IDCurriculo = P.IDCurriculum)
Esse comando irá deletar todos os registros que existem em curriculum_informatica e não possuem correspondentes em curriculo_pessoal. Particularmente eu evitaria a utilização de cursores para essa consulta, pois, além deles não serem performáticos incorrem em mais codificação.
Esse comando apenas irá corrigir o que já foi feito, mas para evitar novas ocorrências do problema, eu sugiro que você implemente as FKs e avalie a opção CASCADE.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
Encontrando tabelas não utilizadas
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!957.entry
Classifique as respostas. O seu feedback é imprescindível- Sugerido como Resposta Gustavo Maia Aguiar quarta-feira, 3 de março de 2010 16:11
- Marcado como Resposta Braulio Cesar Holtz Ribeiro quarta-feira, 3 de março de 2010 18:58
Todas as Respostas
-
cara,
Existem algumas soluções
1 - trigger (não é muito performatica)
2 - FK com cascade
3 - a proc que faz a deleção verifica se existe na taela cv_inf.. e exclui tbm.
att.
Marcelo Fernandes
MCP, MCDBA, MCSA, MCTS. Se útil, classifique!!! -
É, estou pensando em fazer na própria programação, percorrer cada registro no curriculum_informatica e em seguida verificar se tem no curriculum_pessoal, se não tiver, então deleta no curriculum_informatica.
Pensei que poderia ter algum comando SQL mais fácil, mas dai não tenho certeza, então ficará assim, farei via programação que acredito que poderá dar certo. Eu não tenho tanta experiencia mais aprofundada em SQL Server. -
Boa Tarde,
É possível fazer a "limpeza" em um só comando:
DELETE FROM curriculum_informatica As I WHERE NOT EXISTS (SELECT * FROM curriculum_pessoal As P WHERE I.IDCurriculo = P.IDCurriculum)
Esse comando irá deletar todos os registros que existem em curriculum_informatica e não possuem correspondentes em curriculo_pessoal. Particularmente eu evitaria a utilização de cursores para essa consulta, pois, além deles não serem performáticos incorrem em mais codificação.
Esse comando apenas irá corrigir o que já foi feito, mas para evitar novas ocorrências do problema, eu sugiro que você implemente as FKs e avalie a opção CASCADE.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
Encontrando tabelas não utilizadas
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!957.entry
Classifique as respostas. O seu feedback é imprescindível- Sugerido como Resposta Gustavo Maia Aguiar quarta-feira, 3 de março de 2010 16:11
- Marcado como Resposta Braulio Cesar Holtz Ribeiro quarta-feira, 3 de março de 2010 18:58
-
Gustavo, esse código é simples e é o que eu precisava.
Sobre ocorrer mais vezes, isso foi corrigido agora na programação, por incrivel não tinha pra deletar os registros das outras tabelas tirando o curriculum_pessoal, então aproveitei a programação atual e inseri os delete´s das outras tabelas.
A solução FK com cascate me parece boa, mas como não manjo muito, nem vou me arriscar. Só vou precisar desse delete agora e depois já estará resolvido esse problema. -
Olá Braulio,
Implementar a exclusão via aplicação é uma possibilidade, mas lembre-se que isso somente não irá impedir que "lixo" apareça no banco. O mais indicado seria mesmo que você utilizasse as FKs. Não é obrigado a usar CASCADE mas elas evitariam vários problemas de integridade.
[ ]s,
Gustavo Maia Aguiar
http://gustavomaiaaguiar.spaces.live.com
Encontrando tabelas não utilizadas
http://gustavomaiaaguiar.spaces.live.com/blog/cns!F4F5C630410B9865!957.entry
Classifique as respostas. O seu feedback é imprescindível -