segunda-feira, 18 de setembro de 2017

EXCLUINDO TODAS AS TABELAS DE UM SCHEMA - POSTGRESQL/POSTGIS

Para excluir todas as tabelas de um schema, você pode excluir e recriar ele:

DROP SCHEMA nome_do_esquema CASCADE;
CREATE SCHEMA nome_do_esquema;

Porém, se quiser excluir somente as tabelas, pode ser escrito um comando que gera a sintaxe completa para executar a instrução de exclusão de todas as tabelas de um determinado schema, como o comando abaixo:

SELECT 'DROP TABLE nome_do_esquema.' || tablename || ';' 
FROM pg_tables WHERE schemaname = 'nome_do_esquema';

Depois de gerar o comando, basta copiar, colar (se necessário, excluir as aspas) e executá-lo.
Se houver dependências e for necessário usar o CASCADE, use:

SELECT 'DROP TABLE nome_do_esquema.' || tablename || ' CASCADE;' 
FROM pg_tables WHERE schemaname = 'nome_do_esquema';

segunda-feira, 4 de setembro de 2017

ATUALIZAÇÃO COM RELAÇÃO ESPACIAL NO POSTGIS

Muitas vezes é necessário fazer uma atualização de dados por relação espacial no PostGIS. Isso ocorre principalmente quando temos que transformar uma relação espacial em uma relação por chave estrangeira (que é mais rápida em retornar resultados) ou outras, quando há relação espacial entre determinadas geometrias. Quando essas geometrias se tocam, usamos a função ST_Intersects para fazer a atualização (para mais funções de relações espaciais clique aqui).

Por exemplo, uma situação onde é necessário atualizar o número de quadra em lotes:

UPDATE lotes SET id_quadra = id FROM quadras WHERE ST_Intersects(lotes.geom,quadras.geom);

Essa instrução pode ser melhorada, usando o centroide do lote:

UPDATE lotes SET id_quadra = id FROM quadras WHERE ST_Intersects(ST_Centroid(lotes.geom),quadras.geom);

Ou, em outro exemplo, para atualizar o nome do bairro nos lotes:

UPDATE lotes SET nome_bairro = nome FROM bairros WHERE 
ST_Intersects(ST_Centroid(lotes.geom),bairros.geom);