Ver Mensaje Individual
  #2 (permalink)  
Antiguo 30/05/2010, 11:52
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Problema con PK Compuesta y FK

A primera vista el problema es simple:

Código MySQL:
Ver original
  1. -- Esta no tiene PRIMARY KEY:
  2. CREATE TABLE  `docente` (
  3.   `ID_Docente` int(11) default NULL,
  4.   `Nombre_Docente` varchar(20) NOT NULL,
  5.   `Ap1_Docente` varchar(20) NOT NULL,
  6.   `Ap2_Docente` varchar(20) default NULL,
  7.   `Direccion` varchar(50) NOT NULL,
  8.   `Telefono` varchar(12) NOT NULL,
  9.   `Titulo` tinyint(4) NOT NULL
  10.  
  11. -- Esta tampoco tiene PRIMARY KEY:
  12. CREATE TABLE  `estudiante` (
  13.   `ID_Estudiante` int(11) default NULL,
  14.   `Nombre_Estudiante` varchar(20) NOT NULL,
  15.   `Ap1_Estudiante` varchar(20) NOT NULL,
  16.   `Ap2_Estudiante` varchar(20) default NULL,
  17.   `Direccion` varchar(50) NOT NULL,
  18.   `Telefono` varchar(12) default NULL,
  19.   `Nivel_Academico` tinyint(4) NOT NULL,
  20.   `Estrato` tinyint(4) NOT NULL,
  21.   `Estado` tinyint(4) NOT NULL
  22.  
  23. -- Esta si tiene PRIMARY KEY:
  24. CREATE TABLE  `grupo` (
  25.   `Cod_Grupo` tinyint(4) NOT NULL auto_increment,
  26.   `Grado` tinyint(4) NOT NULL,
  27.   `Nomenclatura` varchar(1) NOT NULL,
  28.   PRIMARY KEY  (`Cod_Grupo`)

En estas condiciones, no se puede crear una FK entre Grupo_Docente_Estudiante y el resto de las tablas, simplemente porque una FOREIGN KEY es un campo o conjunto de campos que cuyos valores están referenciados a la PRIMARY KEY de otra tabla. Como sólo una de las tres tablas dependientes tiene PRIMARY KEY, entonces simplemente no se pueden crear esas CONSTRAINT.

¿Se entiende la idea.
Para hacerlo, debes usar un script como este:
Código MySQL:
Ver original
  1. DROP TABLE IF EXISTS `docente`;
  2. CREATE TABLE  `docente` (
  3.   `ID_Docente` int(10) unsigned NOT NULL,
  4.   `Nombre_Docente` varchar(20) NOT NULL,
  5.   `Ap1_Docente` varchar(20) NOT NULL,
  6.   `Ap2_Docente` varchar(20) default NULL,
  7.   `Direccion` varchar(50) NOT NULL,
  8.   `Telefono` varchar(12) NOT NULL,
  9.   `Titulo` tinyint(4) NOT NULL,
  10.   PRIMARY KEY  (`ID_Docente`)
  11.  
  12. DROP TABLE IF EXISTS `estudiante`;
  13. CREATE TABLE  `estudiante` (
  14.   `ID_Estudiante` int(10) unsigned NOT NULL,
  15.   `Nombre_Estudiante` varchar(20) NOT NULL,
  16.   `Ap1_Estudiante` varchar(20) NOT NULL,
  17.   `Ap2_Estudiante` varchar(20) default NULL,
  18.   `Direccion` varchar(50) NOT NULL,
  19.   `Telefono` varchar(12) default NULL,
  20.   `Nivel_Academico` tinyint(4) NOT NULL,
  21.   `Estrato` tinyint(4) NOT NULL,
  22.   `Estado` tinyint(4) NOT NULL,
  23.   PRIMARY KEY  (`ID_Estudiante`)
  24.  
  25. DROP TABLE IF EXISTS `grupo`;
  26. CREATE TABLE  `grupo` (
  27.   `Grado` tinyint(4) unsigned NOT NULL,
  28.   `Nomenclatura` varchar(1) NOT NULL,
  29.   PRIMARY KEY  (`Cod_Grupo`)
  30.  
  31. DROP TABLE IF EXISTS `grupo_docente_estudiante`;
  32. CREATE TABLE  `grupo_docente_estudiante` (
  33.   `Cod_Grupo_GDE` tinyint(4) unsigned NOT NULL default '0',
  34.   `ID_Docente_GDE` int(10) unsigned NOT NULL default '0',
  35.   `ID_Estudiante_GDE` int(10) unsigned NOT NULL default '0',
  36.   PRIMARY KEY  (`ID_Docente_GDE`,`Cod_Grupo_GDE`,`ID_Estudiante_GDE`)
  37.  
  38. ALTER TABLE Grupo_Docente_Estudiante
  39.   ADD CONSTRAINT FK_Grupo_GDE
  40.   FOREIGN KEY(Cod_Grupo_GDE) REFERENCES Grupo(Cod_Grupo);
  41.  
  42. ALTER TABLE Grupo_Docente_Estudiante
  43.   ADD CONSTRAINT FK_ID_Docente_GDE
  44.   FOREIGN KEY(ID_Docente_GDE) REFERENCES Docente(ID_Docente);
  45.  
  46. ALTER TABLE Grupo_Docente_Estudiante
  47.   ADD CONSTRAINT FK_ID_Est_GDE
  48.   FOREIGN KEY(ID_Estudiante_GDE) REFERENCES Estudiante(ID_Estudiante);
  49.  
  50. ALTER TABLE Grupo_Docente_Estudiante
  51.   ADD CONSTRAINT PK_COD_IDDoc_IDEst
  52.   PRIMARY KEY(ID_Docente_GDE,Cod_Grupo_GDE,ID_Estudiante_GDE);
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)