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

llaves foraneas

Estas en el tema de llaves foraneas en el foro de Mysql en Foros del Web. 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 ...
  #1 (permalink)  
Antiguo 26/02/2015, 20:08
Avatar de Tecan777  
Fecha de Ingreso: febrero-2015
Ubicación: tehuaca,Puebla,Mexico
Mensajes: 18
Antigüedad: 9 años, 2 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
  #2 (permalink)  
Antiguo 27/02/2015, 14:43
Avatar de Tecan777  
Fecha de Ingreso: febrero-2015
Ubicación: tehuaca,Puebla,Mexico
Mensajes: 18
Antigüedad: 9 años, 2 meses
Puntos: 1
Respuesta: llaves foraneas

he publicado otros temas y me han ayudado a resolverlos guiandome al resultadi, pero ahora al parecer nadie ha visto el tema o simplemente no les interesa...bueno...he tenido que recurrir a otros foros y han resolvido mis dudas, ahora les comento he cambiado la estructura un poco e implemente el uso de UNIQUE en lugar de las compuestas y he probado inserciones y todo esta bien.les dejo el codigo

Código SQL:
Ver original
  1. CREATE TABLE usuarios(
  2. id_usuario INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
  3. login VARCHAR(20) NOT NULL,
  4. clave VARCHAR(16) NOT NULL,
  5. nivel VARCHAR(20) NOT NULL,
  6. UNIQUE (login)
  7. ) engine = innodb;
  8.  
  9. CREATE TABLE materia(
  10. id_materia INT AUTO_INCREMENT NOT NULL PRIMARY KEY,
  11. nombre VARCHAR(30) NOT NULL,
  12. duracion DATE NOT NULL,
  13. UNIQUE (nombre)
  14. ) engine = innodb;
  15.  
  16. FOREIGN KEY(editorial) REFERENCES editoriales(codigoeditorial) ON UPDATE cascade ON DELETE cascade
  17.  
  18. CREATE TABLE alumno(
  19. id_alumno VARCHAR(11) PRIMARY KEY ,
  20. nombre VARCHAR(20) NOT NULL,
  21. apellidos VARCHAR(40) NOT NULL,
  22. direccion VARCHAR(30) NOT NULL,
  23. telefono INT,
  24. email VARCHAR(40),
  25. login_alu VARCHAR(20) NOT NULL,
  26. clave_alu VARCHAR(16) NOT NULL,
  27. materia_alu VARCHAR(30) NOT NULL,
  28. FOREIGN KEY(login_alu) REFERENCES usuarios(login) ON UPDATE cascade ON DELETE cascade,
  29. FOREIGN KEY(materia_alu) REFERENCES materia(nombre) ON UPDATE cascade ON DELETE cascade
  30. ) engine = innodb;
  31.  
  32. CREATE TABLE docente(
  33. id_docente VARCHAR(11) PRIMARY KEY ,
  34. nombre VARCHAR(20) NOT NULL,
  35. apellidos VARCHAR(40) NOT NULL,
  36. direccion VARCHAR(30) NOT NULL,
  37. telefono INT,
  38. email VARCHAR(40),
  39. login_doc VARCHAR(20) NOT NULL,
  40. clave_doc VARCHAR(16) NOT NULL,
  41. materia_doc VARCHAR(30) NOT NULL,
  42. FOREIGN KEY(login_doc) REFERENCES usuarios(login) ON UPDATE cascade ON DELETE cascade,
  43. FOREIGN KEY(materia_doc) REFERENCES materia(nombre) ON UPDATE cascade ON DELETE cascade
  44. ) engine = innodb;


Ahora solo me necesito ua tabla llamada carga la cual contendra:
id_carga auto_increment es el numero de folio de la carga
alu---nombre del alumno referenciado al nombre de algun alumno registrado
doc--nombre de docente referenciado al nombre de un docente registrado
materia-nombre de materia registrada
fecha_inicio--cuando inicio el curso
calificacion int---para asignar un calificacion una vez terminado el curso...


¿Alguna idea de como se podria implementar?...¿esa tabla me obligaria a cambiar algun otro campo de las otras materias para referenciarla?.....escucho sugerencias, de antemano muchas gracias...

Última edición por gnzsoloyo; 28/02/2015 a las 18:15
  #3 (permalink)  
Antiguo 27/02/2015, 17:14
Avatar de Tecan777  
Fecha de Ingreso: febrero-2015
Ubicación: tehuaca,Puebla,Mexico
Mensajes: 18
Antigüedad: 9 años, 2 meses
Puntos: 1
Respuesta: llaves foraneas

He seguido leyendo, y buscando informacion alterna, y he resolvido que esta bien mi tabla carga, ya la he implementado, solo son las consultas que deben de cambiar: ejemplo
select *
from materia t, docentes p
where t.nombre = p.id_nombre.
si a alguien le interesa el código, puedo postearlo si gustan, espero que les sea de ayuda...y si tienen alguna sugerencia pueden comentarla, me gusta recibir opiniones sobre mis trabajos para mejorarlos...saludos!!!

Etiquetas: mysql+consulta, mysql+db, mysql-error
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 19:49.