2010-03-19 34 views
10

¿Existe una forma (más o menos) estándar de comprobar no solo si existe una tabla denominada mytable, sino también si su esquema es similar al que debería ser? Estoy experimentando con H2 database y"Crear tabla si no existe": ¿cómo verificar el esquema también?

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

declaraciones aparentemente sólo para comprobar el nombre table's . Esperaría obtener una excepción si hay una tabla con el nombre de pila, pero con un esquema diferente.

+0

"a table with a similar name"? "un esquema similar a lo que debería ser"? Eso es demasiado vago para que una herramienta de consulta general lo entienda. – Thilo

+0

+1 porque también quiero una instalación de este tipo. No necesariamente por la base de datos, sino en una herramienta/biblioteca. – Thilo

+0

@Thilo: Se suponía que era "una mesa con el nombre de pila", corregido ahora. Por "esquema similar a lo que debería ser" quiero decir que si existe una tabla llamada 'mitabla', su esquema debe ser igual a lo que proporcioné a la consulta; de lo contrario, quiero obtener algún tipo de error. Esta es una consulta perfectamente definida, así que me pregunto si (y si no, por qué no) hay una forma de expresarlo. En realidad, me sorprendió que "SI NO EXISTE" pareciera verificar solo el nombre. –

Respuesta

1

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

No lo he usado (hice rodar 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 cuán similar debe ser el esquema para pasar. Nombres de columnas, orden de columnas, tipos de columnas, definición de clave principal: sin duda. Pero, ¿qué hay de las restricciones, los nombres de las restricciones, las definiciones del espacio de tablas, etc.?

+0

Veo, podría no ser tan simple como pensaba. Aún así, dado que se trata de una verificación de que prácticamente cualquier software que use cualquier base de datos * debería * hacer, es sorprendente que no haya una solución estándar. –

4

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 que puede hacer algo como: connection.getMetaData().getTables(connection.getCatalog(), null, null, null)

Para más información ver javadoc java.sql.Connection.

+0

que tampoco verifica el esquema, (por supuesto, usando el MetaData, puedes comprobarlo tú mismo, pero eso es tedioso. JDBC MetaData tiene una API horrible). – Thilo

1

respuesta doble:

(a) La existencia de una mesa es algo que debe ser garantizada por el procedimiento de instalación de una aplicación, no por la propia aplicación en tiempo de ejecución.

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

+2

Muchas aplicaciones no quieren molestar a sus usuarios con un script de instalador/actualizador separado y administrar su esquema de base de datos internamente.Incluso si no crean tablas, tiene sentido comprobar el esquema de la tabla al inicio para afirmar la integridad de la aplicación (en lugar de fallar con errores aleatorios de la base de datos en algún momento posterior). No estoy diciendo que este enfoque sea siempre apropiado, pero es algo válido de querer en algunos casos. – Thilo

+0

Sí, también creo que si bien a) puede ser la forma habitual de hacerlo, es similar a, por ejemplo, "la existencia de una unidad C: es algo que debe garantizarse mediante el procedimiento de instalación de una aplicación, no mediante la aplicación en sí mismo en tiempo de ejecución ". Pero una aplicación seria no debe hacer suposiciones sobre el medio ambiente. En cambio, debería verificarlo. Los entornos pueden cambiar, y tarde o temprano lo harán. –

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

¿Podrías por favor elaborar? ¿Qué hace esto? –

+1

Hago lo que se dice que hace ... Comprueba si existe tal tabla en la base de datos. El 'INFORMATION_SCHEMA' está (algo) estandarizado, por lo que esta declaración funciona en la mayoría de las bases de datos. –

+0

también funciona en MSSQL, pero el esquema "predeterminado" es "dbo" – isapir

Cuestiones relacionadas