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

Problema con Foreign Key

Estas en el tema de Problema con Foreign Key en el foro de Bases de Datos General en Foros del Web. Tengo un problema con mis dos foreign como he dicho en el titulo y es la primera vez que me da este error: Can't create ...
  #1 (permalink)  
Antiguo 02/06/2012, 10:28
 
Fecha de Ingreso: abril-2012
Mensajes: 42
Antigüedad: 11 años, 11 meses
Puntos: 1
Problema con Foreign Key

Tengo un problema con mis dos foreign como he dicho en el titulo y es la primera vez que me da este error: Can't create table 'gestionPlantilla.#sql-1ba6_31' (errno: 150)

Tengo ya creada la base de la aplicación web en php pero me falla las foreign key de mi base de datos para esa aplicación web.

Me imagino que la tabla cita se tendrá que dividir en citaJugador y citaTrabajador por ejemplo, pero antes de intentarlo quiero ver los consejos de otras personas que saben mas que yo.

Una cosa e cogido el código directamente de mi script php, si veis alguna coma, punto y coma, " de mas es porque se me ha pasado borrarla, no me dado cuenta

MUCHAS GRACIAS

PONGO EL CÓDIGO:

CREATE DATABASE gestionPlantilla;
USE gestionPlantilla;


CREATE TABLE plantilla
( IDPlantilla char(5) not null,
Nombre char(20) not null,
Categoria char(20) not null,
PRIMARY KEY(IDPlantilla) );

CREATE TABLE jugadores
( IDJugador int auto_increment,
NombreJugador char(10) ,
Apellidos char(10) ,
FechaNacimiento date ,
Posicion char(10) ,
Dorsal int ,
Situacion enum('Lesionado','Activo'),
Antiguedad int ,
PRIMARY KEY(IDJugador) );

CREATE TABLE cuerpoTecnico
IDEmpleado int auto_increment,
NombreTrabajador char(10) ,
Apellidos char(10),
FechaNacimiento date ,
PuestoTrabajo char(20),
PRIMARY KEY(IDEmpleado) );

CREATE TABLE cita
( CodigoCita int auto_increment,
Dia date,
Hora time ,
NombreJugador char(10) ,
NombreTrabajador char(10) ,
$Asunto char(25),
$PRIMARY KEY(CodigoCita));

ALTER TABLE cita ADD CONSTRAINT citaJug FOREIGN KEY (NombreJugador)
REFERENCES jugadores (NombreJugador) ON DELETE SET NULL;

ALTER TABLE cita ADD CONSTRAINT citaCuer FOREIGN KEY (NombreTrabajador)
REFERENCES cuerpoTecnico (NombreTrabajador) ON DELETE SET NULL;
  #2 (permalink)  
Antiguo 02/06/2012, 11:07
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: Problema con Foreign Key

Es un error básico de comprensión del concepto.
Una FOREIGN KEY es un campo o conjunto de campos que referencia a la PRIMARY KEY de otra tabla.
Por extensión, MySQL admite que se creen FK que apuntan a los campos que han sido definidos como UNIQUE en su tabla, por cuanto estos fungen de claves primarias candidatas o alternativas.
En tu caso estás tratando de hacer que la FK a crear apunte a un campo que no es PK en su tabla y tampoco es UNIQUE, y eso es simplemente imposible.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 02/06/2012, 14:17
 
Fecha de Ingreso: abril-2012
Mensajes: 42
Antigüedad: 11 años, 11 meses
Puntos: 1
Respuesta: Problema con Foreign Key

Perdón, que es el código viejo. En mi tabla jugadores y cuerpotecnico los dos ya están con un unique y en cita tengo las tres claves primarias: código, jugador y trabajador. Y ya me daba ese error.

Tu explicación quería decir eso no?
  #4 (permalink)  
Antiguo 02/06/2012, 15:34
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: Problema con Foreign Key

Cita:
en cita tengo las tres claves primarias: código, jugador y trabajador
Sólo puede existir una sola clave primaria. En todo caso te debes estar refiriendo a que tienes una clave primaria compuesta ¿Es así?

Por otro lado, ten en cuenta que si no nos brindas códigos actualizados y completos, no puedes pedir que te podamos dar soluciones que te sirvan. ¿No te parece?

Postea el CREATE TABLE de cada tabla completo y sin quitarle nada. Simplificaciones no sirven para tu caso.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 02/06/2012 a las 16:09
  #5 (permalink)  
Antiguo 02/06/2012, 16:45
 
Fecha de Ingreso: abril-2012
Mensajes: 42
Antigüedad: 11 años, 11 meses
Puntos: 1
Respuesta: Problema con Foreign Key

Lose, es que me había equivocado de fichero.sql

CREATE DATABASE gestionPlantilla;
USE gestionPlantilla;


CREATE TABLE plantilla
(Nombre char(20) not null,
Categoria char(20) not null,
PRIMARY KEY(Nombre) );

CREATE TABLE jugadores
(NombreJugador char(10) ,
Apellidos char(10) ,
FechaNacimiento date ,
Posicion char(10) ,
Dorsal int ,
Situacion enum('Lesionado','Activo'),
Antiguedad int ,
PRIMARY KEY(NombreJugador) );

CREATE TABLE cuerpoTecnico
(NombreTrabajador char(10) ,
Apellidos char(10),
FechaNacimiento date ,
PuestoTrabajo char(20),
PRIMARY KEY(NombreTrabajador) );

CREATE TABLE cita
( CodigoCita int auto_increment,
Dia date,
Hora time ,
Jugador char(10) not null,
Trabajador char(10) not null,
Asunto char(25),
PRIMARY KEY(CodigoCita));

ALTER TABLE cita ADD CONSTRAINT citaJug FOREIGN KEY (Jugador)
REFERENCES jugadores (NombreJugador) ON DELETE SET NULL;

ALTER TABLE cita ADD CONSTRAINT citaCuer FOREIGN KEY (Trabajador)
REFERENCES cuerpoTecnico (NombreTrabajador) ON DELETE SET NULL";

Última edición por jediap; 02/06/2012 a las 16:51
  #6 (permalink)  
Antiguo 03/06/2012, 07:52
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: Problema con Foreign Key

No veo en tu script ninguna definición de UNIQUE para los campos NombreJugador y NombreTrabajador. Y como te dije, si no son por lo menos UNIQUE, no funcionará.

Además tienes que tener en cuenta una cosa: Cuando intentas crear una FK, lo primero que hacen los DBMS es comprobar si en la tabla referida, el campo en cuestión cumple con la restricción de unicidad, y sino, no se puede crear.
Eso implica que esas tablas (Jugadores y Cuerotecnico) deben tener forzosamente valores únicos en ese campo... cosa que me parece poco probable, ya que se trata del nombre de pila de la persona. En esas condiciones no creo que ni siquiera puedas declararlo UNIQUE...

Por otro lado, como te dije, la definición de las tablas en tu script está incompleta. Faltan parámetros que normalmente MySQL les pone cuando se recupera el CREATE TABLE.

Haznos un favor: Ejecuta las siguientes consultas y postea el resultado de cada una de ellas en un solo script, de esa forma sabremos que es lo que realmente existe, y no lo que supones que existe.

Código MySQL:
Ver original
  1. SHOW CREATE TABLE plantilla;
  2. SHOW CREATE TABLE jugadores;
  3. SHOW CREATE TABLE cuerpoTecnico;

Esto debería dar como resultado algo así:
Código MySQL:
Ver original
  1. CREATE TABLE `cita` (
  2.   `CodigoCita` int(11) NOT NULL auto_increment,
  3.   `Dia` date default NULL,
  4.   `Hora` time default NULL,
  5.   `Jugador` char(10) NOT NULL,
  6.   `Trabajador` char(10) NOT NULL,
  7.   `Asunto` char(25) default NULL,
  8.   PRIMARY KEY  (`CodigoCita`)
  9.  
  10. CREATE TABLE `cuerpotecnico` (
  11.   `NombreTrabajador` char(10) NOT NULL default '',
  12.   `Apellidos` char(10) default NULL,
  13.   `FechaNacimiento` date default NULL,
  14.   `PuestoTrabajo` char(20) default NULL,
  15.   PRIMARY KEY  (`NombreTrabajador`)
  16.  
  17. CREATE TABLE `jugadores` (
  18.   `NombreJugador` char(10) NOT NULL default '',
  19.   `Apellidos` char(10) default NULL,
  20.   `FechaNacimiento` date default NULL,
  21.   `Posicion` char(10) default NULL,
  22.   `Dorsal` int(11) default NULL,
  23.   `Situacion` enum('Lesionado','Activo') default NULL,
  24.   `Antiguedad` int(11) default NULL,
  25.   PRIMARY KEY  (`NombreJugador`)
  26.  
  27. CREATE TABLE `plantilla` (
  28.   `Nombre` char(20) NOT NULL,
  29.   `Categoria` char(20) NOT NULL,
  30.   PRIMARY KEY  (`Nombre`)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)

Última edición por gnzsoloyo; 03/06/2012 a las 08:00
  #7 (permalink)  
Antiguo 03/06/2012, 13:59
 
Fecha de Ingreso: abril-2012
Mensajes: 42
Antigüedad: 11 años, 11 meses
Puntos: 1
Respuesta: Problema con Foreign Key

Ya tengo solucionado el problema, la ejecución es correcta.
Subo el fichero modificado. Muchas gracias por estas explicaciones me han ayudado a ver
unas cosas que no tenia hasta el momento en cuenta.
Creo que esto ya es correcto

CREATE DATABASE gestionPlantilla;
USE gestionPlantilla;


CREATE TABLE plantilla
(Nombre char(20) not null,
Categoria char(20) not null,
PRIMARY KEY(Nombre) );

CREATE TABLE jugadores
(CodigoJugador int unique auto_increment,
NombreJugador char(10),
Apellidos char(10) ,
FechaNacimiento date ,
Posicion char(10) ,
Dorsal int ,
Situacion enum('Lesionado','Activo'),
Antiguedad int ,
PRIMARY KEY(CodigoJugador) );

CREATE TABLE cuerpoTecnico
(CodigoTrabajador int unique auto_increment ,
Nombre char(10),
Apellidos char(10),
FechaNacimiento date ,
PuestoTrabajo char(20),
PRIMARY KEY(CodigoTrabajador) );

CREATE TABLE cita
(CodigoCita int auto_increment,
Dia date,
Hora time ,
Jugador int unique,
Trabajador int unique,
Asunto char(25),
PRIMARY KEY(CodigoCita));

ALTER TABLE cita ADD CONSTRAINT citaJug FOREIGN KEY (Jugador)
REFERENCES jugadores (CodigoJugador) ON DELETE SET NULL;

ALTER TABLE cita ADD CONSTRAINT citaCuer FOREIGN KEY (Trabajador)
REFERENCES cuerpoTecnico (CodigoTrabajador) ON DELETE SET NULL;

Etiquetas: key, sql, tabla, foreignkey
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 09:57.