SQL portatile per determinare se esiste una tabella o no?
-
22-07-2019 - |
Domanda
Esiste un modo portatile per determinare se esiste già una tabella del database?
Soluzione
Portable? Non credo.
Forse il più vicino che puoi ottenere è:
select * from <table>
E questo restituirebbe un errore se la tabella non esiste.
Altri suggerimenti
Purtroppo è portatile, purtroppo:
select
count(*)
from
information_schema.tables
where
table_name = 'tablename'
and table_schema = 'dbo'
Funziona sicuramente su SQL Server, MySQL e Postgres. Non tanto su Oracle, però. Per questo dovresti accedere al dizionario dei dati Oracle. Tuttavia, esiste un progetto open source che crea information_schema
in Oracle dal dizionario dei dati. Puoi provarlo se hai bisogno di portabilità assoluta.
Lo schema P.S. non deve essere dbo
, ma è il più comune.
Direi
select 'x' from <table_name> where 0=1;
Lo svantaggio è che se ricevi un errore, non sai con certezza quale sia stata la vera causa. Potrebbe mancare la tabella o ad es. un errore di connessione. È possibile analizzare il messaggio di errore, ma sicuramente non sarebbe portatile.
Le viste INFORMATION_SCHEMA sono standard ANSI, quindi dovrebbero essere l'opzione più portabile. Non dimenticare di aggiungere lo schema e il tipo di tabella alla clausola 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
Ecco qualcosa che è ragionevolmente portatile:
seleziona ora () da TABLE limit 1;
Non si basa sulla conoscenza di alcuna colonna particolare.
Non comporta il sovraccarico che conta (*) a volte.
Non importa se la tabella è vuota o meno.
Non riesce se la tabella non esiste.
Poiché ogni DBMS ha una propria metabase, penso che il più " portable " modo per farlo è utilizzare il chiamante dell'applicazione stessa. Qualcosa come
try
execute("select top 1 * from table")
return (true)
catch
return false
Tentativo di interrogare la tabella. Se la query ha esito negativo, viene visualizzato un errore, non esiste.
Probabilmente è il più portatile possibile. L'onere della produzione del risultato dipende quindi dal codice che richiede la tabella / database.
select top 1 *
from MyTable
Mantieni la query il più semplice possibile per prevenire altri possibili errori.