Ver Mensaje Individual
  #1 (permalink)  
Antiguo 26/02/2015, 20:08
Avatar de Tecan777
Tecan777
 
Fecha de Ingreso: febrero-2015
Ubicación: tehuaca,Puebla,Mexico
Mensajes: 18
Antigüedad: 9 años, 10 meses
Puntos: 1
Mensaje llaves foraneas

Hola amigos, antes que nada espero se encuentre bien...pasare al tema por el cual decidi abrirlo, tengo dos tablas: usuarios y materia, quiero crear una tabla llamada alumnos la cual tenga llaves foraneas hacia usuarios y a la tabla materia, ahora he realizado las llaves foraneas con el tipo de dato "Int" a otro "Int" y si me ha corrido, pero al hacerlo de "varchar " a "varchar" no me permite, me sale el siguiente error:
ERROR 1215 (HY000): Impossible d'ajouter des contraintes d'index externe
En español: ERROR 1215 (HY000): No se puede agregar índice de restricciones externas o No puede adicionar clave extranjera constraint.
El error de arriba me sale al intentar crear la tabla alumno.
Ahora no se a que se deba, he leido que si se pueden hacer llaves foraneas con varchar, y ese es mi caso, tengo la misma longitud y el mismo tipo de dato, pero no funciona, al igual cambie las claves primarias compuestas por "UNIQUE Key" e igual no funciono,
estas es la explicacion de mis tablas:
los usuarios son para acceder al sistema por eso solo requeria lo que era el
id_usuario= auto_increment para llevar un conteo de usuarios
login= sobrenombre o nick del usuario.
clave= clave para acceder al sistema.
nivel= este puede ser ('administrador','docente' y 'alumno')
ahora cree una clave primaria compuesta( la cual contiene el id_usuario,login y clave) esto porque ningun alumno y docente pueden tener los mismos campos de (id_usuario,login y clave).

En la tabla materia:
id_materia= identificador de la materia auto_increment porque se lleva un control ascendente de la materia.
nombre= nombre de la materia.
duracion de tipo date: los cursos duran semanas(4 como ejemplo).
y tambien cree una clave primaria compuesta(id_materia y nombre) porque ninguna materia puede tener el mismo identificador y nombre.

Tabla alumno:(aqui esta la informacion referente al alumno)
id_alumno= matricula del alumno.
nombre
apellidos
direccion
telefono
email
( y le agregue las llaves foraneas donde solo pueden tener un login, clave y una materia).
les dejo el código, espero que me puedan ayudar, se los agradeceria mucho, al igual acepto sugerencias...saludos desde mexico

Código SQL:
Ver original
  1. CREATE TABLE usuarios(
  2. id_usuario INT AUTO_INCREMENT,
  3. login VARCHAR(20) ,
  4. clave VARCHAR(16) ,
  5. nivel VARCHAR(20) ,
  6. PRIMARY KEY(id_usuario,login,clave)
  7. ) engine = innodb;
  8.  
  9. CREATE TABLE materia(
  10. id_materia INT AUTO_INCREMENT,
  11. nombre VARCHAR(30) NOT NULL,
  12. duracion DATE,
  13. PRIMARY KEY(id_materia,nombre)
  14. ) engine = innodb;
  15.  
  16. CREATE TABLE alumno(
  17. id_alumno VARCHAR(11) PRIMARY KEY,
  18. nombre VARCHAR(20) NOT NULL,
  19. apellidos VARCHAR(40) NOT NULL,
  20. direccion VARCHAR(30) NOT NULL,
  21. telefono INT,
  22. email VARCHAR(40),
  23. login_alumno VARCHAR(20) NOT NULL,
  24. clave_alumno VARCHAR(16) NOT NULL,
  25. materia_alumno VARCHAR(30) NOT NULL,
  26. FOREIGN KEY(login_alumno) REFERENCES usuarios(login) ON UPDATE cascade ON DELETE cascade,
  27. FOREIGN KEY(clave_alumno) REFERENCES usuarios(clave) ON UPDATE cascade ON DELETE cascade,
  28. FOREIGN KEY(materia_alumno) REFERENCES materia(nombre) ON UPDATE cascade ON DELETE cascade
  29. ) engine = innodb;

Última edición por gnzsoloyo; 28/02/2015 a las 18:15 Razón: Correcion codigo