views:

406

answers:

4

Is there a (more or less) standard way to check not only whether a table named mytable exists, but also whether its schema is similar to what it should be? I'm experimenting with H2 database, and

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

statements apparently only check for the table´s name. I would expect to get an exception if there's a table with the given name, but different schema.

+1  A: 

I am not aware of any database that has this feature natively.

Have not used it (rolled my own code to do this) but maybe Apache DdlUtils can help.

It is a tricky thing to do, especially if you want it to work with different database vendors. Also, there are probably different opinions about how similar the schema needs to be in order to pass. Column names, column order, column types, primary key definition: certainly. But how about constraints, the names of the constraints, table space definitions, and so on?

Thilo
I see, it might not be as simple thing as I thought. Still, given that this is a check that virtually any piece of software using any database *should* do, it's amazing that there's no standard solution.
Joonas Pulakka
+1  A: 

CREATE TABLE IF NOT EXISTS ... is not a standard SQL code.

The thing to do is to check if the table is already in the catalogue. For instance, in Java you may do something like: connection.getMetaData().getTables(connection.getCatalog(), null, null, null)

For more info see javadoc java.sql.Connection.

Chris
that does not check the schema either, though (of course, using the MetaData, you could check it yourself, but that is tedious. JDBC MetaData has a horrible API.).
Thilo
+1  A: 

Twofold answer :

(a) The existence of a table is something that should be ensured by the installation procedure of an application, not by the application itself at run-time.

(b) If you really think you have a valid reason for deviating from (a), you could try and query the catalog, which is a database consisting of tables whose structure is, more or less, prescribed by the INFORMATION_SCHEMA of the SQL standard. Which tables exist, which columns they have, which data types those columns are, which keys are declared, etc. etc., it's all in there.

Erwin Smout
Many applications do not want to trouble their user with a separate installer/updater script and manage their database scheme internally. Even if they do not create tables, it does make sense to check the table schema at startup to assert the integrity of the application (rather than failing with random database errors sometime later). I am not saying this approach is always appropriate, but it is a valid thing to want in some cases.
Thilo
Yes, I also think that while a) may be the usual way to go, it similar to, say, "the existence of a C: drive is something that should be ensured by the installation procedure of an application, not by the application itself at run-time.". But a serious application should make no assumptions about the environment. Instead, it should check it. Environments can change - and sooner or later they will.
Joonas Pulakka
A: 

In response to :

"Yes, I also think that while a) may be the usual way to go, it similar to, say, "the existence of a C: drive is something that should be ensured by the installation procedure of an application, not by the application itself at run-time.". But a serious application should make no assumptions about the environment. Instead, it should check it. Environments can change - and sooner or later they will."

If you deploy your application on any flavour of Unix/AIX OS, you'd experience serious problems if your application tried to assert the existence of a C: drive at run-time.

That is PRECISELY the reason why applications should NOT verify install-time parameters/conditions at run-time.

Erwin Smout
I think that's also the reason why application should not rely on the existence or correctness of a database that was *supposed to be* created on install-time.
Joonas Pulakka