"Crear tabla si no existe": ¿cómo verificar el esquema también?

¿Hay una forma (más o less) estándar de verificar no solo si existe una tabla llamada mytable , sino también si su esquema es similar a lo que debería ser? Estoy experimentando con la database H2 , y

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

las declaraciones aparentemente solo verifican el nombre de la tabla. Esperaría get una exception si hay una tabla con el nombre de stack, pero con un esquema diferente.

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

CREATE TABLE IF NOT EXISTS ... no es un código SQL estándar.

Lo que hay que hacer es verificar si la tabla ya está en el catálogo. Por ejemplo, en Java puede hacer algo como: connection.getMetaData().getTables(connection.getCatalog(), null, null, null)

Para get más información, consulte javadoc java.sql.Connection .

No conozco ninguna database que tenga esta característica de forma nativa.

No lo he usado (rodado mi propio código para hacer esto) pero tal vez Apache DdlUtils puede ayudar.

Es algo complicado de hacer, especialmente si desea que funcione con diferentes proveedores de bases de datos. Además, probablemente haya opiniones diferentes sobre lo similar que debe ser el esquema para aprobar. Nombres de columnas, order de columnas, types de columnas, definición de key principal: sin duda. Pero, ¿qué hay de las restricciones, los nombres de las restricciones, las definiciones del espacio de tablas, etc.?

Respuesta doble:

(a) La existencia de una tabla es algo que debe garantizarse mediante el procedimiento de installation de una aplicación, no por la propia aplicación en time de ejecución.

(b) Si realmente cree que tiene un motivo válido para desviarse de (a), puede intentar consultar el catálogo, que es una database compuesta por tablas cuya estructura está, más o less, prescrita por INFORMATION_SCHEMA del estándar SQL . Qué tablas existen, qué columnas tienen, qué tipo de datos son esas columnas, qué keys se declaran, etc., todo está allí.