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

[Solucionado] Problema con PK Compuesta y FK

Estas en el tema de [Solucionado] Problema con PK Compuesta y FK en el foro de Mysql en Foros del Web. Hola a Todos: Veran, tengo un Problema con una Tabla en MySQL. Necesito que todos sus atributos (3 En Total) Conformen una PK Compuesta (Ya ...
  #1 (permalink)  
Antiguo 30/05/2010, 11:35
 
Fecha de Ingreso: mayo-2010
Mensajes: 21
Antigüedad: 13 años, 11 meses
Puntos: 0
[Solucionado] Problema con PK Compuesta y FK

Hola a Todos:


Veran, tengo un Problema con una Tabla en MySQL. Necesito que todos sus atributos (3 En Total) Conformen una PK Compuesta (Ya lo hice), pero a cada uno de ellos le llega una relacion desde otra tabla, es decir, cada atributo de esa PK es una FK. El Problema es que, al crear los Constraints y revisar, solo dos FK se crean, la tercera no aparece. Intente creandola manualmente y me sale el error 121, cuando en Realidad mis FK no tienen nombres Duplicados. Les Dejo la definicion de la tabla y de los Constraints... Espero me puedan echar una mano. Les Agradeceria inmensamente, ya que me he pasado por cuanto foro he encontrado y no he dado con ninguna solucion:


Código:

CREATE TABLE Grupo(Cod_Grupo TINYINT AUTO_INCREMENT,
				   Grado TINYINT NOT NULL,
				   Nomenclatura VARCHAR(1) NOT NULL,
				   PRIMARY KEY(Cod_Grupo));
				  
CREATE TABLE Grupo_Docente_Estudiante(Cod_Grupo_GDE TINYINT,
									  ID_Docente_GDE INT,
									  ID_Estudiante_GDE INT);

CREATE TABLE Docente(ID_Docente INT,
					 Nombre_Docente VARCHAR(20) NOT NULL,
					 Ap1_Docente VARCHAR(20) NOT NULL,
					 Ap2_Docente VARCHAR(20),
					 Direccion VARCHAR(50) NOT NULL,
					 Telefono VARCHAR(12) NOT NULL,
					 Titulo TINYINT NOT NULL);

CREATE TABLE Estudiante(ID_Estudiante INT,
						Nombre_Estudiante VARCHAR(20) NOT NULL,
						Ap1_Estudiante VARCHAR(20) NOT NULL,
						Ap2_Estudiante VARCHAR(20),						
						Direccion VARCHAR(50) NOT NULL,						
						Telefono VARCHAR(12),						
						Nivel_Academico TINYINT NOT NULL,						
						Estrato TINYINT NOT NULL,
						Estado TINYINT NOT NULL);
Y Los Constraints De La Tabla en Cuestion:

Código:
ALTER TABLE Grupo_Docente_Estudiante ADD CONSTRAINT PK_COD_IDDoc_IDEst PRIMARY KEY(ID_Docente_GDE,Cod_Grupo_GDE,ID_Estudiante_GDE);

ALTER TABLE Grupo_Docente_Estudiante ADD CONSTRAINT FK_Grupo_GDE FOREIGN KEY(Cod_Grupo_GDE) REFERENCES Grupo(Cod_Grupo);

ALTER TABLE Grupo_Docente_Estudiante ADD CONSTRAINT FK_ID_Docente_GDE FOREIGN KEY(ID_Docente_GDE) REFERENCES Docente(ID_Docente);

ALTER TABLE Grupo_Docente_Estudiante ADD CONSTRAINT FK_ID_Est_GDE FOREIGN KEY(ID_Estudiante_GDE) REFERENCES Estudiante(ID_Estudiante);

Espero me puedan ayudar.

Muchisimas Gracias a Todos

Última edición por Astantler; 30/05/2010 a las 16:13 Razón: Solucionado
  #2 (permalink)  
Antiguo 30/05/2010, 11: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, 4 meses
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)
  #3 (permalink)  
Antiguo 30/05/2010, 12:19
 
Fecha de Ingreso: mayo-2010
Mensajes: 21
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Problema con PK Compuesta y FK

gnzsoloyo, Disculpame, es que se me olvidaba... Tengo la costumbre de agregar algunas PK por fuera como constraints (ALTER TABLE), parecido al constraint PK de la tabla en cuestion. Todas las tablas tienen sus PK definidas correctamente, por eso no me explico el problema, como te digo, alfunas PK las defino como constraints, no dentro de la tabla.
  #4 (permalink)  
Antiguo 30/05/2010, 14: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, 4 meses
Puntos: 2658
Respuesta: Problema con PK Compuesta y FK

No importa el dónde agregues las PK (siempre es preferible en la definición inicial de la tabla y no por fuera), sino cuando.

Postea, por favor el script que realmente usas y no uno imaginario, porque sino no pretenderás respuestas certeras.
El problema puede estar en una parte no visible a simple vista.

Recuerda:
Las sentencias que realmente usas. Todas. Completas.
__________________
¿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 30/05/2010, 14:03
 
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
  #6 (permalink)  
Antiguo 30/05/2010, 15:06
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, 4 meses
Puntos: 2658
Respuesta: Problema con PK Compuesta y FK

Bien, tal y como lo sospeché, di no hubieses posteado todo, no lo hubiese encontrado: Era un problema de palabras reservadas, casi indetectable: El problema está en el uso de Area().
Area, con un paréntesis a continuación, es una función geométrica usada en la extensión espacial de MySQL, y representa el áre de un Polygon o un MultiPolygon, por lo cual MySQL interpreta que hay un error de sintaxis (Ver, por ejemplo 18.5.2.6. Funciones MultiPolygon).

La solución es encerrar esos nombres (a menos que los puedas cambiar), entre acentos graves (`). De esa forma puedes usarlo y el sistema lo reconocerá como nombre y no como palabra reservada. Esto deberás tenerlo en cuenta incluso en las consultas.

Un tip adicional, es que es conveniente que siempre un CREATE venga precedido en el script de un
Código MySQL:
Ver original
  1. DROP <objeto> IF EXISTS <nombre>;
, para poder probar su ejecución en esta etapa.

El script en esta forma debería funcionar (al menos a mí me funciona):
Código MySQL:
Ver original
  1. DROP DATABASE IF EXISTS db_colegio;
  2. CREATE DATABASE IF NOT EXISTS db_colegio;
  3. -- Script Para Crear Las Tablas de la BD
  4. USE db_colegio;
  5.  
  6. CREATE TABLE Estudiante(ID_Estudiante INT,
  7.   Nombre_Estudiante VARCHAR(20) NOT NULL,
  8.   Ap1_Estudiante VARCHAR(20) NOT NULL,
  9.   Ap2_Estudiante VARCHAR(20),
  10.   Direccion VARCHAR(50) NOT NULL,
  11.   Telefono VARCHAR(12),
  12.   Nivel_Academico TINYINT NOT NULL,
  13.   Estrato TINYINT NOT NULL,
  14.   Estado TINYINT NOT NULL);
  15.  
  16. CREATE TABLE Estado_Estudiante(
  17.   Estado VARCHAR(15) NOT NULL);
  18.  
  19. CREATE TABLE Niveles_Academicos(
  20.   Nivel VARCHAR(10));
  21.  
  22. CREATE TABLE Docente(ID_Docente INT,
  23.    Nombre_Docente VARCHAR(20) NOT NULL,
  24.    Ap1_Docente VARCHAR(20) NOT NULL,
  25.    Ap2_Docente VARCHAR(20),
  26.    Direccion VARCHAR(50) NOT NULL,
  27.    Telefono VARCHAR(12) NOT NULL,
  28.    Titulo TINYINT NOT NULL);
  29.  
  30. CREATE TABLE Titulos_Docentes(
  31.   Titulo VARCHAR(50) NOT NULL);
  32.  
  33.   `Area` VARCHAR(20) NOT NULL,
  34.   Intensidad_Semanal TINYINT NOT NULL);
  35.  
  36. CREATE TABLE Grupo(
  37.   Grado TINYINT NOT NULL,
  38.   Nomenclatura VARCHAR(1) NOT NULL);
  39.  
  40. CREATE TABLE Grupo_Docente_Estudiante(
  41.   Cod_Grupo_GDE TINYINT,
  42.   ID_Docente_GDE INT,
  43.   ID_Estudiante_GDE INT);
  44.  
  45. CREATE TABLE Docente_Por_Area(
  46.   ID_Docente_DPA INT,
  47.   Cod_Area_DPA TINYINT);
  48.  
  49. CREATE TABLE Tipos_Examenes(
  50.   Cod_Tipo_Examen TINYINT PRIMARY KEY AUTO_INCREMENT,
  51.   Tipo_Examen VARCHAR(30) NOT NULL);
  52.  
  53. CREATE TABLE Examen(
  54.   Titulo_Examen VARCHAR(30),
  55.   Grupo_Examen TINYINT,
  56.   Docente INT NOT NULL,
  57.   Tipo_Examen TINYINT NOT NULL);
  58.  
  59. CREATE TABLE Tipos_Preguntas(
  60.   Cod_Tipo_Pregunta TINYINT PRIMARY KEY AUTO_INCREMENT,
  61.   Tipo_Pregunta VARCHAR(20) NOT NULL);
  62.  
  63. CREATE TABLE Preguntas_Por_Examen(
  64.   Cod_Pregunta_PPE TINYINT AUTO_INCREMENT,
  65.   Cod_Examen_PPE SMALLINT,
  66.   Num_Pregunta TINYINT NOT NULL,
  67.   Enunciado VARCHAR(1024) NOT NULL,
  68.   Tipo_De_Pregunta TINYINT NOT NULL,
  69.   PRIMARY KEY(Cod_Pregunta_PPE,Cod_Examen_PPE));
  70.  
  71. -- RESPUESTA TIENE 100 CARACTERES PORQUE CUANDO ES JUSTIFICACION LA RESPUESTA ES TEXTO INGRESADO POR EL USUARIO
  72. CREATE TABLE Respuestas_Por_Examen(
  73.   Cod_Respuesta_RPE SMALLINT AUTO_INCREMENT,
  74.   Cod_Pregunta_RPE TINYINT,
  75.   Cod_Examen_RPE SMALLINT,
  76.   Respuesta VARCHAR(100) NOT NULL,
  77.   PRIMARY KEY(Cod_Respuesta_RPE,Cod_Pregunta_RPE,Cod_Examen_RPE));
  78.  
  79. CREATE TABLE Historial_Academico(
  80.   Estudiante INT NOT NULL,
  81.   Ano DATE NOT NULL);
  82.  
  83. CREATE TABLE Detalle_Historial(
  84.   Cod_Det_Historial MEDIUMINT AUTO_INCREMENT,
  85.   Cod_Historial_DH MEDIUMINT,
  86.   Examen_Presentado SMALLINT NOT NULL,
  87.   Nota NUMERIC(5,2) NOT NULL,
  88.   PRIMARY KEY(Cod_Det_Historial,Cod_Historial_DH));
  89.  
  90. CREATE TABLE Usuarios(
  91.   Nom_Usuario VARCHAR(15) NOT NULL,
  92.   Contrasena VARCHAR(32) NOT NULL,
  93.   Perfil TINYINT NOT NULL,
  94.   Propietario INT NOT NULL);
  95.  
  96. CREATE TABLE Perfiles_Cuenta(
  97.   Descripcion VARCHAR(30) NOT NULL);
  98.  
  99. /* ------------------------------------------------------------------------------------- */
  100. ALTER TABLE Estudiante
  101.   ADD CONSTRAINT PK_ID_Estudiante
  102.   PRIMARY KEY(ID_Estudiante);
  103.  
  104. ALTER TABLE Estudiante
  105.   ADD CONSTRAINT FK_Estado_Estudiante
  106.   FOREIGN KEY(Estado) REFERENCES Estado_Estudiante(Cod_Estado);
  107.  
  108. ALTER TABLE Estudiante
  109.   ADD CONSTRAINT FK_Nivel
  110.   FOREIGN KEY(Nivel_Academico) REFERENCES Niveles_Academicos(Cod_Nivel);
  111.  
  112. ALTER TABLE Docente
  113.   ADD CONSTRAINT PK_ID_Docente
  114.   PRIMARY KEY(ID_Docente);
  115.  
  116. ALTER TABLE Docente
  117.   ADD CONSTRAINT FK_Titulo
  118.   FOREIGN KEY(Titulo) REFERENCES Titulos_Docentes(ID_Titulo);
  119.  
  120. ALTER TABLE Docente_Por_Area
  121.   ADD CONSTRAINT PK_ID_Cod_Docente
  122.   PRIMARY KEY(ID_Docente_DPA,Cod_Area_DPA);
  123.  
  124. ALTER TABLE Docente_Por_Area
  125.   ADD CONSTRAINT FK_Cod_Area_DPA
  126.   FOREIGN KEY(Cod_Area_DPA) REFERENCES `Area`(Cod_Area);
  127.  
  128. ALTER TABLE Docente_Por_Area
  129.   ADD CONSTRAINT FK_ID_Docente_Area
  130.   FOREIGN KEY(ID_Docente_DPA) REFERENCES Docente(ID_Docente);
  131.  
  132. ALTER TABLE Grupo_Docente_Estudiante
  133.   ADD CONSTRAINT PK_COD_IDDoc_IDEst
  134.   PRIMARY KEY(ID_Estudiante_GDE,Cod_Grupo_GDE,ID_Docente_GDE);
  135.  
  136. ALTER TABLE Grupo_Docente_Estudiante
  137.   ADD CONSTRAINT FK_Grupo_GDE
  138.   FOREIGN KEY(Cod_Grupo_GDE) REFERENCES Grupo(Cod_Grupo);
  139.  
  140. ALTER TABLE Grupo_Docente_Estudiante
  141.   ADD CONSTRAINT FK_ID_Docente_GDE
  142.   FOREIGN KEY(ID_Docente_GDE) REFERENCES Docente(ID_Docente);
  143.  
  144. ALTER TABLE Grupo_Docente_Estudiante
  145.   ADD CONSTRAINT FK_ID_Est_GDE
  146.   FOREIGN KEY(ID_Estudiante_GDE) REFERENCES Estudiante(ID_Estudiante);
  147.  
  148. ALTER TABLE Examen
  149.   ADD CONSTRAINT FK_Examen_Area
  150.   FOREIGN KEY(Area) REFERENCES `Area`(Cod_Area);
  151.  
  152. ALTER TABLE Examen
  153.   ADD CONSTRAINT FK_Examen_Docente
  154.   FOREIGN KEY(Docente) REFERENCES Docente(ID_Docente);
  155.  
  156. ALTER TABLE Examen
  157.   ADD CONSTRAINT FK_Examen_Tipo
  158.   FOREIGN KEY(Tipo_Examen) REFERENCES Tipos_Examenes(Cod_Tipo_Examen);
  159.  
  160. ALTER TABLE Examen
  161.   ADD CONSTRAINT FK_Grupo_Examen
  162.   FOREIGN KEY(Grupo_Examen) REFERENCES Grupo(Cod_Grupo);
  163.  
  164. ALTER TABLE Preguntas_Por_Examen
  165.   ADD CONSTRAINT FK_Cod_Examen_PPE
  166.   FOREIGN KEY(Cod_Examen_PPE) REFERENCES Examen (Cod_Examen);
  167.  
  168. ALTER TABLE Preguntas_Por_Examen
  169.   ADD CONSTRAINT FK_Tipo_Pregunta
  170.   FOREIGN KEY(Tipo_De_Pregunta) REFERENCES Tipos_Preguntas (Cod_Tipo_Pregunta);
  171.  
  172. ALTER TABLE Respuestas_Por_Examen
  173.   ADD CONSTRAINT FK_Cod_Preg_Examen
  174.   FOREIGN KEY(Cod_Pregunta_RPE) REFERENCES Preguntas_Por_Examen (Cod_Pregunta_PPE);
  175.  
  176. ALTER TABLE Respuestas_Por_Examen
  177.   ADD CONSTRAINT FK_Cod_Examen
  178.   FOREIGN KEY(Cod_Examen_RPE) REFERENCES Preguntas_Por_Examen (Cod_Examen_PPE);
  179.  
  180. ALTER TABLE Detalle_Historial
  181.   ADD CONSTRAINT FK_Cod_Historial_DH
  182.   FOREIGN KEY(Cod_Historial_DH) REFERENCES Historial_Academico(Cod_Historial);
  183.  
  184. ALTER TABLE Detalle_Historial
  185.   ADD CONSTRAINT FK_Examen_Pres
  186.   FOREIGN KEY(Examen_Presentado) REFERENCES Examen(Cod_Examen);
  187.  
  188. ALTER TABLE Usuarios
  189.   ADD CONSTRAINT FK_Perfil
  190.   FOREIGN KEY(Perfil) REFERENCES Perfiles_Cuenta(Cod_Perfil);
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 30/05/2010, 16:12
 
Fecha de Ingreso: mayo-2010
Mensajes: 21
Antigüedad: 13 años, 11 meses
Puntos: 0
Respuesta: Problema con PK Compuesta y FK

gnzsoloyo, Muchisimas Gracias Por Tu Ayuda, De verdad, no hubiera podido hacer esto sin tu ayuda! Cosas que se tendran que ir aprendiendo....


De Nuevo, Muchas Gracias

Etiquetas: compuesta, primaria, 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 16:31.