Thread View: es.comp.lenguajes.java
1 messages
1 total messages
Started by Ricardo Palomares Martinez
Sun, 20 May 2007 20:41
[OT] Duda sobre restricciones SQL (en Java)
Author: Ricardo Palomares Martinez
Date: Sun, 20 May 2007 20:41
Date: Sun, 20 May 2007 20:41
97 lines
4906 bytes
4906 bytes
Saludos:
Marco el mensaje como off-topic porque creo que el problema es
estrictamente de SQL, pero como estoy un poco pez, también podría ser
simplemente un problema en Java o en la biblioteca que estoy usando...
El caso es que uso DdlUtils (http://db.apache.org/ddlutils/) para
mantener la estructura de la base de datos de mi aplicación al día sin
tener que ejecutar yo directamente órdenes SQL (porque me vendría mal
tener que ir usuario por usuario, dado que es una aplicación para
hacer traducciones y podría ser usada por todo el mundo). :-)
Recientemente he añadido una nueva tabla ("VERSIONS") con esta
definición en el XML que usa DdlUtils (creo que es auto-explicativo):
<table name="VERSIONS">
<column name="ID" primaryKey="true" required="true" type="INTEGER"
size="10" autoIncrement="true" />
<column name="L10NCODE" primaryKey="false" required="true"
type="VARCHAR" size="10" autoIncrement="false" />
<column name="PRODCODE" primaryKey="false" required="true"
type="VARCHAR" size="16" autoIncrement="false" />
<column name="VERSCODE" primaryKey="false" required="true"
type="VARCHAR" size="16" autoIncrement="false" />
(...otros campos internos...)
<unique name="VERSIONS-IDSET">
<unique-column name="L10NCODE" />
<unique-column name="PRODCODE" />
<unique-column name="VERSCODE" />
</unique>
<foreign-key foreignTable="L10N" name="VERSIONS_FK_L10NCODE_L10N">
<reference foreign="L10NCODE" local="L10NCODE" />
</foreign-key>
<foreign-key foreignTable="PRODUCTS"
name="VERSIONS_FK_PRODCODE_PRODUCTS">
<reference foreign="PRODCODE" local="PRODCODE" />
</foreign-key>
<foreign-key foreignTable="USERS"
name="VERSIONS_FK_VERSOWNER_USERS">
<reference foreign="USERCODE" local="VERSOWNER" />
</foreign-key>
</table>
Las restricciones sobre claves externas las añadí a posteriori, de
manera que primero se creó la tabla (que está completamente vacía) y
ahora el sistema intenta añadir las restricciones, causando estas
excepciones:
Caused by: org.apache.ddlutils.DatabaseOperationException: Error while
executing SQL
ALTER TABLE VERSIONS ADD CONSTRAINT VERSIONS_FK_L10NCODE_L10N
FOREIGN KEY (L10NCODE) REFERENCES L10N (L10NCODE)
Caused by: SQL Exception: Constraint 'VERSIONS_FK_L10NCODE_L10N' is
invalid: there is no unique or primary key constraint on table
'SA.L10N' that matches the number and types of the columns in the
foreign key.
Parece que no puede añadir la restricción porque la tabla L10N no
tiene ninguna restricción de unicidad o clave primaria que coincida
con la clave externa de VERSIONS, es decir, que L10NCODE en la tabla
L10N no está definido como clave primaria ni marcado con restricción
de unicidad, pero yo entiendo que no:
<table name="L10N">
<column name="ID" primaryKey="true" required="true" type="INTEGER"
size="10" autoIncrement="true"/>
<column name="L10NCODE" primaryKey="false" required="true"
type="VARCHAR" size="10" autoIncrement="false"/>
(...otros campos internos...)
<unique name="SQL070323085908901">
<unique-column name="L10NCODE"/>
</unique>
</table>
El nombre "raro" de la claúsula "unique" se debe a que esta tabla la
creé con el explorador de bases de datos de NetBeans y lo único que
hice fue marcar el campo como "Unique" durante la definición de la
tabla. NetBeans creó la restricción de unicidad como un índice de
valores únicos y (supongo) Derby, al no facilitársele un nombre para
la restricción, le dio uno generado.
En fin, no sé si no entiendo el mensaje de error de SQL, se me está
escapando algo, o es que directamente la biblioteca DdlUtils no
funciona correctamente. ¿Alguien puede darme su opinión, por favor?
Gracias por anticipado.
--
If it's true that we are here to help others,
then what exactly are the OTHERS here for?
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads