none
Registros sem ligação a outra tabela RRS feed

  • 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
    quarta-feira, 3 de março de 2010 13:09

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
    quarta-feira, 3 de março de 2010 16:10

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!!!
    quarta-feira, 3 de março de 2010 13:28
    Moderador
  • É, 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.

    quarta-feira, 3 de março de 2010 14:14
  • 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
    quarta-feira, 3 de março de 2010 16:10
  • 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.
    quarta-feira, 3 de março de 2010 18:57
  • 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
    quarta-feira, 3 de março de 2010 19:22
  • Valeu Gustavo. Vou primeiramente resolver uma solução mais rápida e em seguida estudarei mais sobre o FK e irei colocar no SQL pra que possa resolver esse problema por completo, só preciso dar mesmo uma aprofundada logo nisso.
    quinta-feira, 4 de março de 2010 01:14