SQL portátil para determinar si existe una tabla o no?
-
22-07-2019 - |
Pregunta
¿Hay alguna forma portátil de determinar si una tabla de base de datos ya existe o no?
Solución
Portátil? No lo creo.
Tal vez lo más cercano que puede obtener es:
select * from <table>
Y esto devolvería un error si la tabla no existe.
Otros consejos
Esto es lo más portátil posible, lamentablemente:
select
count(*)
from
information_schema.tables
where
table_name = 'tablename'
and table_schema = 'dbo'
Esto definitivamente funciona en SQL Server, MySQL y Postgres. Sin embargo, no tanto en Oracle. Tendría que acceder al diccionario de datos de Oracle para eso. Sin embargo, hay un proyecto de código abierto que crea information_schema
en Oracle a partir del Diccionario de datos. Puede intentarlo si necesita portabilidad absoluta.
El esquema P.S. no tiene que ser dbo
, pero es el más común.
Yo diría
select 'x' from <table_name> where 0=1;
El inconveniente es que si obtiene un error, no sabe con certeza cuál fue la verdadera causa. Puede faltar la tabla o p. Un error de conexión. Puede analizar el mensaje de error, pero definitivamente no sería portátil.
Las vistas INFORMATION_SCHEMA son estándar ANSI, por lo que deberían ser su opción más portátil. No olvide agregar el esquema y el tipo de tabla a su 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
Aquí hay algo que es razonablemente portátil:
seleccione ahora () del TABLA límite 1;
No se basa en el conocimiento de ninguna columna en particular.
No incurre en los gastos generales que el recuento (*) a veces tiene.
No importa si la tabla está vacía o no.
Falla si la tabla no existe.
Como cada DBMS tiene su propia metabase, creo que la mayoría " portable " La forma de hacerlo es usando la aplicación que llama. Algo como
try
execute("select top 1 * from table")
return (true)
catch
return false
Intenta consultar la tabla. Si la consulta falla, obtiene un error, no existe.
Probablemente sea lo más portátil posible. La carga de producir el resultado depende del código que consulta la tabla / base de datos.
select top 1 *
from MyTable
Mantenga la consulta lo más simple posible para evitar otros posibles errores.