2010-03-19 17 views
10

Esiste un modo (più o meno) standard per verificare non solo se esiste una tabella denominata mytable, ma anche se il suo schema è simile a quello che dovrebbe essere? Sto sperimentando con H2 database e"Crea una tabella se non esiste" - come controllare anche lo schema?

CREATE TABLE IF NOT EXISTS mytable (....) 

dichiarazioni apparentemente solo controllare per il nome table's . Mi aspetterei di ottenere un'eccezione se c'è una tabella con il nome dato, ma schema diverso.

+0

"un tavolo con un nome simile"? "uno schema simile a quello che dovrebbe essere"? Questo è troppo vago per essere compreso da uno strumento di query generale. – Thilo

+0

+1 perché voglio anch'io una struttura del genere. Non necessariamente dal database, ma in uno strumento/libreria. – Thilo

+0

@Thilo: doveva essere "tabella con il nome specificato", ora corretto. Con "schema simile a quello che dovrebbe essere" intendo che se esiste una tabella chiamata 'mytable', il suo schema deve essere uguale a quello che ho fornito alla query; altrimenti voglio ottenere qualche tipo di errore. Questa è una query perfettamente definita, quindi mi chiedo se (e se no, perché no) c'è un modo per esprimerlo. In realtà sono rimasto sorpreso dal fatto che "SE NON ESISTE" sembra controllare solo il nome. –

risposta

1

Non sono a conoscenza di alcun database che abbia questa funzionalità in modo nativo.

Non l'ho usato (ha arrotolato il mio codice per farlo) ma forse Apache DdlUtils può essere d'aiuto.

È una cosa complicata da fare, soprattutto se si desidera che funzioni con diversi fornitori di database. Inoltre, ci sono probabilmente diverse opinioni su come lo schema deve essere simile per poter passare. Nome delle colonne, ordine delle colonne, tipi di colonne, definizione della chiave primaria: certamente. Ma per quanto riguarda i vincoli, i nomi dei vincoli, le definizioni di tablespace e così via?

+0

Vedo, potrebbe non essere la cosa più semplice di quanto pensassi. Tuttavia, dato che questo è un controllo che praticamente qualsiasi software utilizzi qualsiasi database * dovrebbe * fare, è sorprendente che non ci sia una soluzione standard. –

4

CREATE TABLE IF NOT EXISTS ... non è un codice SQL standard.

La cosa da fare è controllare se la tabella è già nel catalogo. Per esempio, in Java si può fare qualcosa di simile: connection.getMetaData().getTables(connection.getCatalog(), null, null, null)

Per maggiori informazioni visita javadoc java.sql.Connection.

+0

che non controlla lo schema, anche se (ovviamente usando il MetaData, è possibile controllarlo da soli, ma è noioso.JDBC MetaData ha un'API orribile.). – Thilo

1

duplice risposta:

(a) L'esistenza di una tabella è qualcosa che dovrebbe essere garantita dalla procedura di installazione di un'applicazione, non per l'applicazione stessa in fase di esecuzione.

(b) Se si pensa veramente di avere un valido motivo per deviare da (a), si può provare a interrogare il catalogo, che è un database costituito da tabelle la cui struttura è, più o meno, prescritta da INFORMATION_SCHEMA dello standard SQL. Quali tabelle esistono, quali colonne hanno, quali tipi di dati sono quelle colonne, quali chiavi sono dichiarate, ecc. Ecc., È tutto lì dentro.

+2

Molte applicazioni non vogliono disturbare i loro utenti con uno script di installazione/aggiornamento separato e gestire internamente il loro schema di database.Anche se non creano tabelle, ha senso controllare lo schema della tabella all'avvio per affermare l'integrità dell'applicazione (piuttosto che fallire con errori casuali del database qualche tempo dopo). Non sto dicendo che questo approccio sia sempre appropriato, ma in alcuni casi è una cosa valida da volere. – Thilo

+0

Sì, penso anche che mentre a) può essere la solita strada da percorrere, è simile a, diciamo, "l'esistenza di un'unità C: è qualcosa che dovrebbe essere assicurata dalla procedura di installazione di un'applicazione, non dall'applicazione stesso in fase di esecuzione. ". Ma un'applicazione seria non dovrebbe fare supposizioni sull'ambiente. Invece, dovrebbe controllarlo. Gli ambienti possono cambiare - e prima o poi lo faranno. –

5
SELECT * 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME  = 'TableName' 
    AND TABLE_SCHEMA = 'public' 
+0

Potresti per favore elaborare? Cosa fa questo? –

+1

Faccio ciò che si dice che fa ... Controlla se tale tabella esiste nel database. Il 'INFORMATION_SCHEMA' è (un po ') standardizzato, quindi questa affermazione funziona nella maggior parte dei database. –

+0

funziona anche in MSSQL, ma lo schema "predefinito" è "dbo" – isapir

Problemi correlati