Pergunta

Existe uma maneira portátil de determinar se uma tabela de banco de dados já existe ou não?

Foi útil?

Solução

Portable? Eu não penso assim.

Talvez o mais próximo que você pode obter é:

select * from <table>

E isso iria retornar um erro se a tabela não existe.

Outras dicas

Este é tão portátil quanto ele ganha, com tristeza:

select
    count(*)
from
    information_schema.tables
where
    table_name = 'tablename'
    and table_schema = 'dbo'

Este definitivamente funciona no SQL Server, MySQL e PostgreSQL. Não tanto no Oracle, no entanto. Você teria que acessar o dicionário de dados Oracle para isso. No entanto, existe um projeto de código aberto que cria information_schema no Oracle do dicionário de dados . Você pode tentar que se você precisar portabilidade absoluta.

P. S.-Schema não tem que ser dbo, mas isso é o mais comum.

Eu diria

select 'x' from <table_name> where 0=1;

A desvantagem é que se você receber um erro, você não sabe ao certo qual foi a causa real. Pode estar faltando mesa ou por exemplo, um erro de conexão. Você pode analisar a mensagem de erro, mas definitivamente não seria portátil.

As exibições INFORMATION_SCHEMA são padrão ANSI - assim aqueles deve ser sua opção mais portátil. Não se esqueça de adicionar o tipo de esquema e tabela para sua cláusula where ...

if exists(select  *
          from    information_schema.tables
          where   table_schema = 'dbo'
                  and table_name = 'MyTable'
                  and table_type = 'basetable')
begin
     -- your code here
end

Aqui está algo que é razoavelmente portátil:

selecione agora () do limite de Tabela 1;

Ele não depende de conhecimento de qualquer coluna particular.

Ele não incorrer a sobrecarga que count (*) às vezes tem.

Não importa se a tabela está vazia ou não.

Ele falhar se a tabela não existe.

Como todos os DBMS tem seu próprio metabase, eu acho que a maneira mais "portátil" de fazer isso é usando o aplicativo chamador si. Algo como

try
    execute("select top 1 * from table")
    return (true)
catch
    return false

Tente consultar a tabela. Se a consulta falha -. Você receber um erro, ele não existe

Isso é provavelmente tão portátil como você pode começar. O ônus de produzir o resultado, em seguida, depende do código consultando a tabela / banco de dados.

select top 1 *
from MyTable

Mantenha a consulta o mais simples possível para evitar outros possíveis erros.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top