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

Foreign key error

Estas en el tema de Foreign key error en el foro de Bases de Datos General en Foros del Web. Buenas a todos @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código MySQL: Ver original CREATE TABLE Alumnos (     DNI CHAR ( 9 ) ,     Usuario VARCHAR ...
  #1 (permalink)  
Antiguo 16/02/2011, 04:32
 
Fecha de Ingreso: noviembre-2010
Mensajes: 26
Antigüedad: 13 años, 5 meses
Puntos: 0
Foreign key error

Buenas a todos

Código MySQL:
Ver original
  1. CREATE TABLE Alumnos(
  2.     DNI CHAR(9),
  3.     Usuario VARCHAR(10),
  4.     Password VARCHAR(10),
  5.     Nombre VARCHAR(50),
  6.     fechanacimiento DATE,
  7.     dirección VARCHAR(50),
  8.     teléfono VARCHAR(50),
  9.     email VARCHAR(50),
  10.     PRIMARY KEY(DNI)
  11.     );
  12.    
  13. CREATE TABLE Cursos(
  14.     Id INT,
  15.     Nombre VARCHAR (50),
  16.     Descripción VARCHAR (100),
  17.     n_horas INT,
  18.     fechainicio DATE,
  19.     fechafin DATE,
  20.     PRIMARY KEY(Id)
  21.     );
  22.    
  23. CREATE TABLE Matrícula(
  24.     DNI CHAR(9),
  25.     CodCurso INT,
  26.     PRIMARY KEY(DNI, CodCurso),
  27.     FOREIGN KEY(CodCurso) REFERENCES Cursos(Id) ON UPDATE CASCADE ON DELETE CASCADE,
  28.     );
  29.    
  30. CREATE TABLE Profesores(
  31.     DNI CHAR(9),
  32.     Usuario VARCHAR(10),
  33.     Password VARCHAR(10),
  34.     Nombre VARCHAR(50),
  35.     Dirección VARCHAR(50),
  36.     Teléfono VARCHAR(50),
  37.     Correo VARCHAR(50),
  38.     Fechaincorporación DATE,
  39.     PRIMARY KEY(DNI)
  40.     );
  41.  
  42. CREATE TABLE Cursos_Profesores(
  43.     DNI CHAR(9),
  44.     CodCurso INT,
  45.     PRIMARY KEY(CodCurso),
  46.     FOREIGN KEY(DNI) REFERENCES Profesores(DNI) ON UPDATE CASCADE ON DELETE CASCADE,
  47.     FOREIGN KEY(CodCurso) REFERENCES Cursos(Id) ON UPDATE CASCADE ON DELETE CASCADE
  48.     );
  49.    
  50. //AQUI DA EL SUSODICHO ERROR
  51. CREATE TABLE acceso(
  52.     Usuario VARCHAR(10),
  53.     Password VARCHAR(10),
  54.     PRIMARY KEY(Usuario, Password) ,
  55.     FOREIGN KEY (Usuario) REFERENCES Alumnos(Usuario) ON UPDATE CASCADE ON DELETE CASCADE
  56.     );

Error: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'FOREIGN KEY (Password) REFERENCES Alumnos(Password) ON UPDATE CASCADE ON DELTE C' at line 6


Llevo como una hora, pff, he mirado en la guia de referencia, en google, en el libro, y por mi mismo y no hay manera, necesito un cable, porfavor.

Saludos.
  #2 (permalink)  
Antiguo 16/02/2011, 05:00
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, 5 meses
Puntos: 2658
Respuesta: Foreign key error

Código MySQL:
Ver original
  1. #
  2. CREATE TABLE acceso(
  3.   Usuario VARCHAR(10),
  4.   PRIMARY KEY(Usuario, Password) ,
  5.   FOREIGN KEY (Usuario) REFERENCES Alumnos(Usuario)
El caso es mas o menos simple:
1. La PK de ALUMNOS no es (Usuario, Password), sino sólo (DNI). Una FK debe apuntar a la PK de otra tabla y respetar tipo, cantidad y orden de campos y tu lo está apuntando a campos que no pertenecen a la PK. Podrían usarse si y sólo si se define un índice UNIQUE con ellos dos (pasan a ser una clave candidata), cosa que no has hecho.
2. Tienes un error en el ultimo CASCADE. En lugar de decir DELETE dice DELTE.
__________________
¿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 16/02/2011, 10:39
 
Fecha de Ingreso: noviembre-2010
Mensajes: 26
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Foreign key error

Ya he cambiado Usuario y Password de la tabla Alumnos y Profesores como PK.

Y lo he arreglado, pero ahora aparece un error muy extraño:

#1005 - Can't create table 'instituto.acceso' (errno: 150) (<a href="server_engines.php?engine=InnoDB&amp;page=St atus&amp;token=1ca8ee86276d0d0801483ef386c1878e">D etalles...</a>)
  #4 (permalink)  
Antiguo 16/02/2011, 10: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, 5 meses
Puntos: 2658
Respuesta: Foreign key error

Verifica si ya tienes datos en las tablas. Puede darse que al menos una de las tablas contenga datos que no cumplen con la restricción.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #5 (permalink)  
Antiguo 16/02/2011, 11:08
 
Fecha de Ingreso: noviembre-2010
Mensajes: 26
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Foreign key error

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Verifica si ya tienes datos en las tablas. Puede darse que al menos una de las tablas contenga datos que no cumplen con la restricción.
-Tengo datos en las tablas Alumnos y Profesores.
-Cumplen los requisitos, es decir son VARCHAR(10) todos, y lo que contiene son letras, es decir, lo cumple.
-La codificación de los caracteres es la misma para todos, UFC

Aquíe el código fuente:

Código MySQL:
Ver original
  1. CREATE TABLE Alumnos(
  2.     DNI CHAR(9),
  3.     Usuario VARCHAR(10),
  4.     Password VARCHAR(10),
  5.     Nombre VARCHAR(50),
  6.     fechanacimiento DATE,
  7.     dirección VARCHAR(50),
  8.     teléfono VARCHAR(50),
  9.     email VARCHAR(50),
  10.     PRIMARY KEY(DNI, Usuario, Password)
  11.     );
  12.    
  13. CREATE TABLE Cursos(
  14.     Id INT,
  15.     Nombre VARCHAR (50),
  16.     Descripción VARCHAR (100),
  17.     n_horas INT,
  18.     fechainicio DATE,
  19.     fechafin DATE,
  20.     PRIMARY KEY(Id)
  21.     );
  22.    
  23. CREATE TABLE Matrícula(
  24.     DNI CHAR(9),
  25.     CodCurso INT,
  26.     PRIMARY KEY(DNI, CodCurso),
  27.     FOREIGN KEY(CodCurso) REFERENCES Cursos(Id) ON UPDATE CASCADE ON DELETE CASCADE,
  28.     );
  29.    
  30. CREATE TABLE Profesores(
  31.     DNI CHAR(9),
  32.     Usuario VARCHAR(10),
  33.     Password VARCHAR(10),
  34.     Nombre VARCHAR(50),
  35.     Dirección VARCHAR(50),
  36.     Teléfono VARCHAR(50),
  37.     Correo VARCHAR(50),
  38.     Fechaincorporación DATE,
  39.     PRIMARY KEY(DNI, Usuario, Password)
  40.     );
  41.  
  42. CREATE TABLE Cursos_Profesores(
  43.     DNI CHAR(9),
  44.     CodCurso INT,
  45.     PRIMARY KEY(CodCurso),
  46.     FOREIGN KEY(DNI) REFERENCES Profesores(DNI) ON UPDATE CASCADE ON DELETE CASCADE,
  47.     FOREIGN KEY(CodCurso) REFERENCES Cursos(Id) ON UPDATE CASCADE ON DELETE CASCADE
  48.     );
  49.    
  50. CREATE TABLE acceso(
  51.   Usuario VARCHAR(10),
  52.   PRIMARY KEY(Usuario, Password) ,
  53.   FOREIGN KEY (Usuario) REFERENCES Alumnos(Usuario) ON UPDATE CASCADE ON DELETE CASCADE,
  54.   FOREIGN KEY (Usuario) REFERENCES Profesores(Usuario) ON UPDATE CASCADE ON DELETE CASCADE,
  55.   )


Aquí el error:

#1005 - Can't create table 'instituto.acceso' (errno: 150) (<a href="server_engines.php?engine=InnoDB&amp;page=St atus&amp;token=1ca8ee86276d0d0801483ef386c1878e">D etalles...</a>)

He probado montones de soluciones, tu veras, como siempre que es por alguna tonteria.
  #6 (permalink)  
Antiguo 16/02/2011, 11:49
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, 5 meses
Puntos: 2658
Respuesta: Foreign key error

Cita:
Cumplen los requisitos, es decir son VARCHAR(10) todos, y lo que contiene son letras, es decir, lo cumple.
La definición de la tabla sigue estando mal.
La FK debe apuntar a toda la PK como un conjunto único, no a cada campo por separado; si la PK es (A,B), la FK no se puede definir como (B,A). Además, no puedes definir el mismo campo como FK de dos tablas diferentes, ningún DBMS lo acepta que yo sepa.
Otro problema es que estás usando una palabra reservada (Password) como nombre de columna, y eso puede traer problemas.
__________________
¿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; 16/02/2011 a las 12:00
  #7 (permalink)  
Antiguo 16/02/2011, 12:13
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, 5 meses
Puntos: 2658
Respuesta: Foreign key error

Conceptualmente tu error es que quieres manejar los "accesos" con una única tabla y lo que existe es una relación entre los usuarios del sistema, que pueden ser alumnos o profesores.
Én todo caso, los alumnos y los profesores deben estar vinculados a Acceso, y no al revés. Eso simplificaría mucho el panorama. Implicaría que un ALumno y un Profesor primero deben ser Usuarios y luego registrarse, pero es una posibilidad. De lo contrario el sistema se hace más complejo porque hay que separar la relación de Acceso para Alumnos y para Profesores (cosa lógica porque habitualmente un alumno no es profesor en la institución y viceversa).

Esto sería lo que te digo:
Código MySQL:
Ver original
  1. CREATE TABLE Alumnos(
  2.           DNI CHAR(9),
  3.           Usuario VARCHAR(10),
  4.           `Password` VARCHAR(10),
  5.           Nombre VARCHAR(50),
  6.           fechanacimiento DATE,
  7.           direcci&#243;n VARCHAR(50),
  8.           tel&#233;fono VARCHAR(50),
  9.           email VARCHAR(50),
  10.           PRIMARY KEY(DNI),
  11.           FOREIGN KEY(Usuario,`Password`) REFERENCES Acceso(Usuario,`Password`) ON UPDATE CASCADE ON DELETE CASCADE
  12.           );
  13.  
  14.       CREATE TABLE Cursos(
  15.           Id INT,
  16.           Nombre VARCHAR (50),
  17.           Descripci&#243;n VARCHAR (100),
  18.           n_horas INT,
  19.           fechainicio DATE,
  20.           fechafin DATE,
  21.           PRIMARY KEY(Id)
  22.           );
  23.  
  24.       CREATE TABLE Matr&#237;cula(
  25.           DNI CHAR(9),
  26.           CodCurso INT,
  27.           PRIMARY KEY(DNI, CodCurso),
  28.           FOREIGN KEY(CodCurso) REFERENCES Cursos(Id) ON UPDATE CASCADE ON DELETE CASCADE,
  29.           FOREIGN KEY(DNI) REFERENCES Alumnos(DNI) ON UPDATE CASCADE ON DELETE CASCADE
  30.           );
  31.  
  32.       CREATE TABLE Profesores(
  33.           DNI CHAR(9),
  34.           Usuario VARCHAR(10),
  35.           Password VARCHAR(10),
  36.           Nombre VARCHAR(50),
  37.           Direcci&#243;n VARCHAR(50),
  38.           Tel&#233;fono VARCHAR(50),
  39.           Correo VARCHAR(50),
  40.           Fechaincorporaci&#243;n DATE,
  41.           PRIMARY KEY(DNI),
  42.           FOREIGN KEY(Usuario,`Password`) REFERENCES Acceso(Usuario,`Password`) ON UPDATE CASCADE ON DELETE CASCADE
  43.           );
  44.  
  45.       CREATE TABLE Cursos_Profesores(
  46.           DNI CHAR(9),
  47.           CodCurso INT,
  48.           PRIMARY KEY(CodCurso),
  49.           FOREIGN KEY(DNI) REFERENCES Profesores(DNI) ON UPDATE CASCADE ON DELETE CASCADE,
  50.           FOREIGN KEY(CodCurso) REFERENCES Cursos(Id) ON UPDATE CASCADE ON DELETE CASCADE
  51.           );
  52.  
  53.       CREATE TABLE acceso(
  54.         Usuario VARCHAR(10),
  55.         Password VARCHAR(10),
  56.         PRIMARY KEY(Usuario, Password)
  57.         );
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 17/02/2011, 07:33
 
Fecha de Ingreso: noviembre-2010
Mensajes: 26
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Foreign key error

SOLUCIONADO.
Explico un poco:

La verdad que lo que has explicado tiene mucho sentido, y esta muy bien expresado.

Hice unos modificaciones al codigo de las creaciones de las tablas, y hay que decir que la tabla acceso se tiene que poner antes que las de profesores y alumnos, ya que las claves foraneas de estas, apuntan a la tabla acceso, pero si no hay creada una tabla acceso no se puede realizar..

También lo que ley por ahi, que deben tener la misma codificacion las tablas que se unan con foreign key, y que a los campos que apunte una foreign key deben de ser primarios.

Todo lo que digo viene mejor explicado en el transcurso de tema.

Muchas gracias gnzsoloyo.

Etiquetas: key, 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 22:08.