Domanda

Esiste un modo portatile per determinare se esiste già una tabella del database?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top