🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: es.comp.lenguajes.java
Article #362

[OT] Duda sobre restricciones SQL (en Java)

#362
From: Ricardo Palomares Martinez
Date: Sun, 20 May 2007 20:41
97 lines
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?
Technical Details
Message-ID: <9co6i4-spa.ln1@Father.family>
Path: arc1-ca.pugleaf.net!g2news1.google.com!news4.google.com!news.germany.com!aioe.org!Father.family!news

Show Full Headers
Complete Article Headers
X-Google-Thread: 1116f3,4dec967ecffe13d0,start
X-Google-Attributes: gid1116f3,public
X-Google-Language: SPANISH,ASCII
Path: arc1-ca.pugleaf.net!g2news1.google.com!news4.google.com!news.germany.com!aioe.org!Father.family!news
From: Ricardo Palomares Martinez <rpm.PUBLI@iespana.es>
Newsgroups: es.comp.lenguajes.java
Subject: [OT] Duda sobre restricciones SQL (en Java)
Date: Sun, 20 May 2007 22:41:13 +0200
Organization: Hogar, dulce hogar
Lines: 97
Message-ID: <9co6i4-spa.ln1@Father.family>
NNTP-Posting-Host: qfC2gobioItoU11MBfRP2Q.user.aioe.org
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-15
Content-Transfer-Encoding: quoted-printable
X-Complaints-To: abuse@aioe.org
User-Agent: Mozilla/5.0 (X11; U; Linux i686; es-ES; rv:1.8.1.2) Gecko/20070221 SeaMonkey/1.1.1 Mnenhy/0.7.4.0