Ver Mensaje Individual
  #5 (permalink)  
Antiguo 30/05/2010, 14:03
Astantler
 
Fecha de Ingreso: mayo-2010
Mensajes: 21
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Problema con PK Compuesta y FK

Es Un Poco Largo, Posteo El Script Para Crear Las Tablas y el De Los Constraints


Código MySQL:
Ver original
  1. -- Script Para Crear Las Tablas de la BD
  2. USE db_colegio;
  3.  
  4. CREATE TABLE Estudiante(ID_Estudiante INT,
  5.                         Nombre_Estudiante VARCHAR(20) NOT NULL,
  6.                         Ap1_Estudiante VARCHAR(20) NOT NULL,
  7.                         Ap2_Estudiante VARCHAR(20),                    
  8.                         Direccion VARCHAR(50) NOT NULL,                    
  9.                         Telefono VARCHAR(12),                      
  10.                         Nivel_Academico TINYINT NOT NULL,                      
  11.                         Estrato TINYINT NOT NULL,
  12.                         Estado TINYINT NOT NULL);
  13.                        
  14. CREATE TABLE Estado_Estudiante(Cod_Estado TINYINT PRIMARY KEY AUTO_INCREMENT,
  15.                                Estado VARCHAR(15) NOT NULL);
  16.                                
  17. CREATE TABLE Niveles_Academicos(Cod_Nivel TINYINT PRIMARY KEY NOT NULL AUTO_INCREMENT,
  18.                                 Nivel VARCHAR(10));
  19.                        
  20. CREATE TABLE Docente(ID_Docente INT,
  21.                      Nombre_Docente VARCHAR(20) NOT NULL,
  22.                      Ap1_Docente VARCHAR(20) NOT NULL,
  23.                      Ap2_Docente VARCHAR(20),
  24.                      Direccion VARCHAR(50) NOT NULL,
  25.                      Telefono VARCHAR(12) NOT NULL,
  26.                      Titulo TINYINT NOT NULL);
  27.  
  28. CREATE TABLE Titulos_Docentes(ID_Titulo TINYINT PRIMARY KEY AUTO_INCREMENT,
  29.                               Titulo VARCHAR(50) NOT NULL);
  30.                              
  31.                   Area VARCHAR(20) NOT NULL,
  32.                   Intensidad_Semanal TINYINT NOT NULL);
  33.                  
  34.                    Grado TINYINT NOT NULL,
  35.                    Nomenclatura VARCHAR(1) NOT NULL,
  36.                    PRIMARY KEY(Cod_Grupo));
  37.                  
  38. CREATE TABLE Grupo_Docente_Estudiante(Cod_Grupo_GDE TINYINT,
  39.                                       ID_Docente_GDE INT,
  40.                                       ID_Estudiante_GDE INT);
  41.                                      
  42. CREATE TABLE Docente_Por_Area(ID_Docente_DPA INT,
  43.                               Cod_Area_DPA TINYINT);
  44.                              
  45. CREATE TABLE Tipos_Examenes(Cod_Tipo_Examen TINYINT PRIMARY KEY AUTO_INCREMENT,
  46.                             Tipo_Examen VARCHAR(30) NOT NULL);
  47.                              
  48.                     Titulo_Examen VARCHAR(30),
  49.                     Grupo_Examen TINYINT,
  50.                     Area TINYINT NOT NULL,
  51.                     Docente INT NOT NULL,
  52.                     Tipo_Examen TINYINT NOT NULL);
  53.                    
  54. CREATE TABLE Tipos_Preguntas(Cod_Tipo_Pregunta TINYINT PRIMARY KEY AUTO_INCREMENT,
  55.                              Tipo_Pregunta VARCHAR(20) NOT NULL);
  56.                              
  57. CREATE TABLE Preguntas_Por_Examen(Cod_Pregunta_PPE TINYINT AUTO_INCREMENT,
  58.                                   Cod_Examen_PPE SMALLINT,
  59.                                   Num_Pregunta TINYINT NOT NULL,
  60.                                   Enunciado VARCHAR(1024) NOT NULL,
  61.                                   Tipo_De_Pregunta TINYINT NOT NULL,
  62.                                   PRIMARY KEY(Cod_Pregunta_PPE,Cod_Examen_PPE));
  63.                                  
  64. -- RESPUESTA TIENE 100 CARACTERES PORQUE CUANDO ES JUSTIFICACION LA RESPUESTA ES TEXTO INGRESADO POR EL USUARIO
  65. CREATE TABLE Respuestas_Por_Examen(Cod_Respuesta_RPE SMALLINT AUTO_INCREMENT,
  66.                                    Cod_Pregunta_RPE TINYINT,
  67.                                    Cod_Examen_RPE SMALLINT,
  68.                                    Respuesta VARCHAR(100) NOT NULL,
  69.                                    PRIMARY KEY(Cod_Respuesta_RPE,Cod_Pregunta_RPE,Cod_Examen_RPE));
  70.                                    
  71. CREATE TABLE Historial_Academico(Cod_Historial MEDIUMINT PRIMARY KEY AUTO_INCREMENT,
  72.                                  Estudiante INT NOT NULL,
  73.                                  Ano DATE NOT NULL);
  74.                                  
  75. CREATE TABLE Detalle_Historial(Cod_Det_Historial MEDIUMINT AUTO_INCREMENT,
  76.                                Cod_Historial_DH MEDIUMINT,
  77.                                Examen_Presentado SMALLINT NOT NULL,
  78.                                Nota NUMERIC(5,2) NOT NULL,
  79.                                PRIMARY KEY(Cod_Det_Historial,Cod_Historial_DH));
  80.                                
  81.                       Nom_Usuario VARCHAR(15) NOT NULL,
  82.                       Contrasena VARCHAR(32) NOT NULL,
  83.                       Perfil TINYINT NOT NULL,
  84.                       Propietario INT NOT NULL);
  85.  
  86. CREATE TABLE Perfiles_Cuenta(Cod_Perfil TINYINT PRIMARY KEY AUTO_INCREMENT,
  87.                              Descripcion VARCHAR(30) NOT NULL);


Constraints:


Código MySQL:
Ver original
  1. USE db_colegio;
  2. ALTER TABLE Estudiante ADD CONSTRAINT PK_ID_Estudiante PRIMARY KEY(ID_Estudiante); 
  3. ALTER TABLE Estudiante ADD CONSTRAINT FK_Estado_Estudiante FOREIGN KEY(Estado) REFERENCES Estado_Estudiante(Cod_Estado);
  4. ALTER TABLE Estudiante ADD CONSTRAINT FK_Nivel FOREIGN KEY(Nivel_Academico) REFERENCES Niveles_Academicos(Cod_Nivel);                            
  5. ALTER TABLE Docente ADD CONSTRAINT PK_ID_Docente PRIMARY KEY(ID_Docente);
  6. ALTER TABLE Docente ADD CONSTRAINT FK_Titulo FOREIGN KEY(Titulo) REFERENCES Titulos_Docentes(ID_Titulo);
  7. ALTER TABLE Docente_Por_Area ADD CONSTRAINT PK_ID_Cod_Docente PRIMARY KEY(ID_Docente_DPA,Cod_Area_DPA);
  8. ALTER TABLE Docente_Por_Area ADD CONSTRAINT FK_Cod_Area_DPA FOREIGN KEY(Cod_Area_DPA) REFERENCES Area(Cod_Area);
  9. ALTER TABLE Docente_Por_Area ADD CONSTRAINT FK_ID_Docente_Area FOREIGN KEY(ID_Docente_DPA) REFERENCES Docente(ID_Docente);
  10. ALTER TABLE Grupo_Docente_Estudiante ADD CONSTRAINT PK_COD_IDDoc_IDEst PRIMARY KEY(ID_Estudiante_GDE,Cod_Grupo_GDE,ID_Docente_GDE);
  11. ALTER TABLE Grupo_Docente_Estudiante ADD CONSTRAINT FK_Grupo_GDE FOREIGN KEY(Cod_Grupo_GDE) REFERENCES Grupo(Cod_Grupo);
  12. ALTER TABLE Grupo_Docente_Estudiante ADD CONSTRAINT FK_ID_Docente_GDE FOREIGN KEY(ID_Docente_GDE) REFERENCES Docente(ID_Docente);
  13. ALTER TABLE Grupo_Docente_Estudiante ADD CONSTRAINT FK_ID_Est_GDE FOREIGN KEY(ID_Estudiante_GDE) REFERENCES Estudiante(ID_Estudiante);
  14. ALTER TABLE Examen ADD CONSTRAINT FK_Examen_Area FOREIGN KEY(Area) REFERENCES Area(Cod_Area);
  15. ALTER TABLE Examen ADD CONSTRAINT FK_Examen_Docente FOREIGN KEY(Docente) REFERENCES Docente(ID_Docente);
  16. ALTER TABLE Examen ADD CONSTRAINT FK_Examen_Tipo FOREIGN KEY(Tipo_Examen) REFERENCES Tipos_Examenes(Cod_Tipo_Examen);
  17. ALTER TABLE Examen ADD CONSTRAINT FK_Grupo_Examen FOREIGN KEY(Grupo_Examen) REFERENCES Grupo(Cod_Grupo);
  18. ALTER TABLE Preguntas_Por_Examen ADD CONSTRAINT FK_Cod_Examen_PPE FOREIGN KEY(Cod_Examen_PPE) REFERENCES Examen (Cod_Examen);
  19. ALTER TABLE Preguntas_Por_Examen ADD CONSTRAINT FK_Tipo_Pregunta FOREIGN KEY(Tipo_De_Pregunta) REFERENCES Tipos_Preguntas (Cod_Tipo_Pregunta);
  20. ALTER TABLE Respuestas_Por_Examen ADD CONSTRAINT FK_Cod_Preg_Examen FOREIGN KEY(Cod_Pregunta_RPE) REFERENCES Preguntas_Por_Examen (Cod_Pregunta_PPE);
  21. ALTER TABLE Respuestas_Por_Examen ADD CONSTRAINT FK_Cod_Examen FOREIGN KEY(Cod_Examen_RPE) REFERENCES Preguntas_Por_Examen (Cod_Examen_PPE);
  22. ALTER TABLE Detalle_Historial ADD CONSTRAINT FK_Cod_Historial_DH FOREIGN KEY(Cod_Historial_DH) REFERENCES Historial_Academico(Cod_Historial);
  23. ALTER TABLE Detalle_Historial ADD CONSTRAINT FK_Examen_Pres FOREIGN KEY(Examen_Presentado) REFERENCES Examen(Cod_Examen);
  24. ALTER TABLE Usuarios ADD CONSTRAINT FK_Perfil FOREIGN KEY(Perfil) REFERENCES Perfiles_Cuenta(Cod_Perfil);

Y Como es Eso de "Imaginario", las Tablas que postee anteriormente estan contenidas dentro de esto, son las mismas, observa y veras...
Y con lo del "Cuando", entiendo eso, y el orden esta perfecto. Tampoco pretenderia crear una FK de un atributo al que, mucho mas abajo le doy la propiedad de FK, puedes observarlo en los Scripts.

Gracias por tu ayuda