2013/4/23 Marcelo da Silva <marc...@ig.com.br> > > > > Em 23 de abril de 2013 13:27, Flavio Henrique Araque Gurgel < > fla...@4linux.com.br> escreveu: > > >> Em 23-04-2013 13:25, Marcelo da Silva escreveu: >> >> Bem, não é exatamente ao mesmo tempo, mas a ideia é a seguinte: >>> >>> No banco existem N tabelas com o campo "cod_id" >>> >>> Eu gostaria de fazer um update em todas as tabelas que possuem este >>> cod_id par um mesmo numero, exemplo: >>> >>> update tabelaA set cod_id = X where cod_id = Y >>> update tabelaB set cod_id = X where cod_id = Y >>> update tabelaC set cod_id = X where cod_id = Y >>> Etc >>> >>> Pra eu fazer isso tenho que ver todas as tabelas que tem este campo numa >>> base de 200 tabelas pra depois fazer o Update em cada tabela. >>> >>> Será que podemos agilizar este processo com um update e where numa >>> tabela do sistema ? >>> >> >> Não. >> Mas você pode fazer um script que lê as tabelas existentes e "monta" os >> UPDATEs pra você. >> Tudo depende de quantas vezes você terá que fazer isso. >> >> Pergunto: os campos cod_id tem o mesmo significado e são relacionados? >> Por que se forem, você deve relacioná-los com uma chave estrangeira a uma >> tabela que os contém como chave primária. Utilizando "ON UPDATE CASCADE", >> você faz o UPDATE só uma vez na tabela referenciada e todas as outras serão >> atualizadas automaticamente. >> >> >> > Pois é Flavio, até pensei num ForeignKey mas não fiz isso no começo, agora > pra parar tudo e linkar esses campos não será nada facil. > Vou ter que criar um while no sistema pra ler essas tabelas e automatizar > essa alteração. > Tenho que fazer isso porque alguns usuários cadastraram uma mesma empresa > varias vezes com CPNJs diferentes (porque o cliente insistiu pra deixar o > sistema aberto no inicio, sabe como é né)... agora tenho que solucionar o > problema. Mas faz parte :) > > Cara, eu diria pra você NÃO montar esse monte de UPDATE louco, e ao invés disso corrigir o problema e adicionar uma tabela com o campo como chave primária (como recomendado pelo Flávio). Sinceramente, 200 tabelas não é tanto assim, e se a coisa está tão feia, talvez seja a hora de revisar todo modelo.
MAS, para agora, você pode realizar consultas na tabela de catálogo pg_attributes. Exemplo, para adicionar as FKs, você poderia fazer algo do tipo: SELECT 'ALTER TABLE '||attrelid::regclass ||' ADD CONSTRAINT fk_cod_id FOREIGN KEY (cod_id) REFERENCES tabela_cod_id (id) ON UPDATE CASCADE;' FROM pg_attribute WHERE attname = 'bla'; Daí é só executar a consulta, copiar o resultado e re-executar. Com o psql isso é fácil: $ psql -Atf consulta.sql seu_banco | psql seu_banco Claro que terás que inserir os dados corretos na tabela_cod_id antes, mas você pode gerar o insert para isso da mesma forma. Atenciosamente, -- Matheus de Oliveira Analista de Banco de Dados Dextra Sistemas - MPS.Br nível F! www.dextra.com.br/postgres
_______________________________________________ pgbr-geral mailing list pgbr-geral@listas.postgresql.org.br https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral