Eu queria saber se existe uma maneira estabelecida de testar se duas tabelas/relações do PostgreSQL têm a mesma estrutura. Em outras palavras, como testar se eles são compatíveis entre si no sentido de que posso realizar operações de conjunto como UNION ALL
e EXCEPT
neles?
Pesquisei no DBA.SE e em outros lugares e só consigo encontrar perguntas sobre descobrir se o conteúdo de duas tabelas é diferente (por exemplo, Verificar se duas tabelas têm conteúdo idêntico no PostgreSQL ), ou quando a compatibilidade é conhecida (por exemplo , Comparar duas tabelas com a mesma estrutura, mas com números de membros diferentes ). Mas estou interessado em verificar a compatibilidade da estrutura da tabela .
Estou usando o PostgreSQL 10.3, mas as formas compatíveis com o padrão certamente são preferíveis.
Tendo esquema de exemplo como:
e supondo que você não se importe com os nomes das colunas, você pode verificar possíveis conflitos em colunas com união com a consulta:
O resultado mostrará a posição da coluna ofensiva na estrutura e tipo de dados das tabelas.
Se você tiver essa lista reduzida, poderá verificar os detalhes no discionário information_schema.columns para verificar os detalhes de cada coluna.
Acho que a melhor forma é experimentar e ver.
Ou ele lança um erro, ou não.
A principal maneira padrão de extrair informações sobre um banco de dados SQL do próprio banco de dados é o
INFORMATION_SCHEMA
esquema, embora você provavelmente precise escrever essa consulta específica.Neste caso
information_schema.tables
será chave (veja https://www.postgresql.org/docs/current/static/infoschema-columns.html para documentação). A versão mais simples será que as tabelas são compatíveis se para cada coluna da tabela 1 houver uma coluna correspondente com a mesmaordinal_position
edata_type
na tabela 2, e o número de colunas em cada uma for o mesmo (portanto, não há extras na tabela 2) .Para ficar mais avançado, você pode ter que começar a ser mais confuso sobre a correspondência de tipos: diferentes tipos de string (char, varchar, text) com diferentes atributos (size, collation) podem ser compatíveis, por exemplo, e alguns bancos de dados até permitem números
UNION
e tipos de string convertendo implicitamente o numérico [1] e assim por diante.[1] Eu não sou um postgres man, então não posso dizer se este é o caso aqui, mas é fácil de testar. O MS SQL Server tenta ser meio útil, mas força o tipo numérico para
SELECT mixedtype = 1 UNION SELECT mixedtype = '2'
funcionar, masSELECT mixedtype = 'a' UNION SELECT mixedtype = 2
nãoa
pode ser forçado a um número inteiro - então, por segurança, eu diria que os tipos de string e numéricos nunca são compatíveis.Se espera-se que os nomes dos campos sejam os mesmos, uma opção é fazer o script de cada tabela para um arquivo e, em seguida, usar uma ferramenta de comparação de arquivos (como o WinMerge) para comparar os dois scripts lado a lado. Quaisquer diferenças na estrutura serão imediatamente óbvias.
Seguindo a resposta aceita - se você quiser saber quais nomes de coluna são um problema, use o seguinte:
Se você se importa apenas com as diferenças de nome, use
SELECT column_name
apenas e não inclua as outras 2 colunas.