Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] mysql errores al crear FK

Estas en el tema de mysql errores al crear FK en el foro de Mysql en Foros del Web. Estoy literalmente desesperada...llevo 3 días con este problema en el trabajo y no veo manera de resolverlo... Estas son mis tablas: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: ...
  #1 (permalink)  
Antiguo 06/06/2014, 01:41
 
Fecha de Ingreso: agosto-2005
Mensajes: 9
Antigüedad: 18 años, 8 meses
Puntos: 0
Pregunta mysql errores al crear FK

Estoy literalmente desesperada...llevo 3 días con este problema en el trabajo y no veo manera de resolverlo...

Estas son mis tablas:
Código MySQL:
Ver original
  1. CREATE TABLE `dvaggregatecomponents` (
  2. `AGGREGATEKEY` varchar(256) NOT NULL,
  3. `AGGREGATEVERSION` int(4) NOT NULL,
  4. `COMPONENTKEY` varchar(256) NOT NULL,
  5. `COMPONENTVERSION` int(4) NOT NULL,
  6. `ADMIN` int(1) NOT NULL,
  7. PRIMARY KEY (`AGGREGATEKEY`(255),`AGGREGATEVERSION`,`COMPONENT KEY`(255),`COMPONENTVERSION`)

Código MySQL:
Ver original
  1. CREATE TABLE `dvaggregates` (
  2. `AGGREGATEKEY` varchar(256) NOT NULL,
  3. `VERSION` int(4) NOT NULL,
  4. `PROFILEMANAGER` int(10) DEFAULT NULL,
  5. `CUSTOMPORTLETMODE` varchar(4000) DEFAULT NULL,
  6. `CUSTOMWINDOWSTATE` varchar(4000) DEFAULT NULL,
  7. PRIMARY KEY (`AGGREGATEKEY`(255),`VERSION`)

Creando la FK:

Código MySQL:
Ver original
  1. ALTER TABLE `dvaggregatecomponents`
  2. ADD CONSTRAINT dvaggregatecomponents_fk
  3. FOREIGN KEY (`AGGREGATEKEY`, `AGGREGATEVERSION` )
  4. REFERENCES `dvaggregates` (`AGGREGATEKEY` , `VERSION` )

me devuelve:
Error Code: 1071. Specified key was too long; max key length is 767 bytes

Limito entonces el campo varchar:
Código MySQL:
Ver original
  1. ALTER TABLE `dvaggregatecomponents`
  2. ADD CONSTRAINT dvaggregatecomponents_fk
  3. FOREIGN KEY (`AGGREGATEKEY`(249), `AGGREGATEVERSION` )
  4. REFERENCES `dvaggregates` (`AGGREGATEKEY` , `VERSION` )
y el error es:

Error Code: 1215. Cannot add foreign key constraint

no encuentro el problema!!

Los campos son del mismo tipo en ambas tablas, la BD está vacía, el orden es el mismo, las columnas son PK, no hago SET NOT NULL ni en DELETE ni en UPDATE ...

¿Alguna idea?

Un millón de gracias!!!!!

Última edición por gnzsoloyo; 06/06/2014 a las 06:40 Razón: SQL sin etiquetar
  #2 (permalink)  
Antiguo 06/06/2014, 01:53
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: mysql errores al crear FK

`AGGREGATEKEY` varchar(249) NOT NULL,

...

FOREIGN KEY (`AGGREGATEKEY`, `AGGREGATEVERSION` )

Lo que debes hacer es reducirlo en la definición del campo no en la FK. No se si pasarlo de 256 a 249 será suficiente.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 06/06/2014, 06:45
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: mysql errores al crear FK

La primera pregunta que a mi se me ocurre es ¿Por qué defines una PK con longitud de 256 caracteres? ¿Qué valores puede necesitar esa clave para almacenar semejante cosa?
No resulta un modo muy eficiente, parece impráctica, por lo que lo primero que a mi entender habría que hacer es analizar si realmente se necesita una PK de esas características.
Por otro lado, un consejo: No uses palabras en inglés como nombres de columna, tales como "VERSION". Son palabras reservadas, y luego en las consultas pueden disparar errores de sintaxis indetectables si no se los controla debidamente.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 06/06/2014, 06:52
 
Fecha de Ingreso: agosto-2005
Mensajes: 9
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: mysql errores al crear FK

Muchas gracias a los dos, la verdad es q ni las tablas ni el diseño es mío, son "heredadas" de un desarrollo previo y me ha tocado el marrón de hacer ciertas modificaciones...con lo cual, me temo que el cambiar los nombres de las columnas no es viable.

Probaré a cambiar la longitud del VARCHAR y os cuento!

Mil gracias de nuevo por vuestro tiempo!
  #5 (permalink)  
Antiguo 06/06/2014, 07:19
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: mysql errores al crear FK

Me quedé con la duda respecto a qué representa una clave tan larga.
¿Realemnte necesitan esa longitud? ¿QUé dato contiene que pueda requerirlo?

Por otro lado, a menos que estés trabajando para la misma empresa que la usa, deberías intentar convencer al cliente para modificar esa estructura por algo más coherente.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 09/06/2014, 02:58
 
Fecha de Ingreso: agosto-2005
Mensajes: 9
Antigüedad: 18 años, 8 meses
Puntos: 0
De acuerdo Respuesta: mysql errores al crear FK

Muchísimas gracias!! reduciendo el tamaño ha funcionado y me permite crear la FK.

Respondiendo a tu pregunta, no tengo ni idea de q almacenan en dichas tablas, pero tienen otras PK que incluso superan ese tamaño (VARCHAR(512)) por ejemplo

El diseño es de un jefe de mi empresa, con lo cual, ni me planteo meterme en ese jardín de proponerle q lo cambie, ya sabes, él es "dios" y yo sólo soy una pobre programadora con experiencia en bastantes campos, pero totalmente novata en JAVA y en mysql, con lo cual no van a tener en cuenta mi opinión.
  #7 (permalink)  
Antiguo 13/06/2014, 04:42
 
Fecha de Ingreso: agosto-2005
Mensajes: 9
Antigüedad: 18 años, 8 meses
Puntos: 0
Respuesta: mysql errores al crear FK

He encontrado una nueva forma de que me permita crear las FK sin reducir el tamaño de las columnas.

Para ello, al crear la tabla hay que configurar las variables:

Código:
SET GLOBAL innodb_large_prefix=1; 
SET GLOBAL innodb_file_format=barracuda;
y luego basta con añadir al final de la query de creación de la tabla:
ROW_FORMAT=DYNAMIC

Por ejemplo:
Código:
CREATE TABLE `dvaggregates` 
(`aggregatekey` VARCHAR(256), `version` INT(4), 
`profilemanager` INT(10), `customportletmode` VARCHAR(4000), 
`customwindowstate` VARCHAR(4000), CONSTRAINT dvaggregates_PK 
PRIMARY KEY (`aggregatekey`, `version`)) 
ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

Etiquetas: Ninguno
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 00:02.