Ver Mensaje Individual
  #6 (permalink)  
Antiguo 30/05/2010, 15:06
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

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)