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

ERROR: no hay restricción unique que coincida con las tablas referida

Estas en el tema de ERROR: no hay restricción unique que coincida con las tablas referida en el foro de PostgreSQL en Foros del Web. Hola estimados: Tuve que construir una bd en postgresql para una tarea de la U y al crear una tabla me arroja este error ERROR: ...
  #1 (permalink)  
Antiguo 23/03/2008, 19:17
Avatar de v4mp1r0  
Fecha de Ingreso: febrero-2008
Mensajes: 36
Antigüedad: 16 años, 2 meses
Puntos: 0
ERROR: no hay restricción unique que coincida con las tablas referida

Hola estimados:

Tuve que construir una bd en postgresql para una tarea de la U y al crear una tabla me arroja este error

ERROR: no hay restricción unique que coincida con las columnas dadas en la tabla referida «semestre»

Ademas de darme el error no me crea otras tablas: curso, asignacion, horario, recurso y asignacion_recursos, horario. Aqui les dejo las definiciones usadas.

CREATE TABLE Persona(
rut CHAR(10) NOT NULL PRIMARY KEY,
nombres VARCHAR(25) NOT NULL,
apellidos VARCHAR(25) NOT NULL,
direccion VARCHAR(40),
password CHAR(15) NOT NULL,
telefono CHAR(10),
correo_personal VARCHAR(25) NOT NULL,
fecha_nacimiento DATE);

CREATE TABLE Administrador(
rut CHAR(10) NOT NULL PRIMARY KEY,
correo_administrativo VARCHAR(25) NOT NULL,
FOREIGN KEY (rut) REFERENCES Persona(rut));

CREATE TABLE Profesor(
rut CHAR(10) NOT NULL PRIMARY KEY,
grado_academico CHAR(4),
area_desarrollo VARCHAR(20),
departamento VARCHAR(20) NOT NULL,
FOREIGN KEY (rut) REFERENCES Persona (rut));

CREATE TABLE Ayudante(
rut CHAR(10) NOT NULL PRIMARY KEY,
nivel CHAR(1) NOT NULL,
an_o_ingreso CHAR(2),
carrera VARCHAR(20),
FOREIGN KEY (rut) REFERENCES Persona (rut));

CREATE TABLE Semestre(
an_o CHAR(2) NOT NULL,
id_semestre CHAR(2) NOT NULL,
fecha_inicio DATE,
fecha_termino DATE,
PRIMARY KEY (an_o, id_semestre));

CREATE TABLE Curso(
id_curso CHAR(2) NOT NULL PRIMARY KEY,
sigla CHAR(7) NOT NULL,
nombre_curso VARCHAR(25),
departamento VARCHAR(20) NOT NULL,
creditos CHAR(1) NOT NULL,
numero_inscritos INT NOT NULL,
rut CHAR(10) NOT NULL,
an_o CHAR(2) NOT NULL,
id_semestre CHAR(2) NOT NULL,
FOREIGN KEY (rut) REFERENCES Profesor (rut),
FOREIGN KEY (an_o) REFERENCES Semestre (an_o),
FOREIGN KEY (id_semestre) REFERENCES Semestre (id_semestre)); <---- Aqui me da un error

CREATE TABLE Ayudantia(
rut CHAR(10) NOT NULL,
id_curso CHAR(2) NOT NULL,
PRIMARY KEY (rut, id_curso),
FOREIGN KEY (rut) REFERENCES Ayudante (rut),
FOREIGN KEY (id_curso) REFERENCES Curso (id_curso));

CREATE TABLE Asignacion(
id_asignacion CHAR(2) NOT NULL PRIMARY KEY,
id_curso CHAR(2) NOT NULL,
id_sala CHAR(2) NOT NULL,
id_horario INT NOT NULL,
FOREIGN KEY (id_curso) REFERENCES Curso (id_curso),
FOREIGN KEY (id_sala) REFERENCES Sala (id_sala),
FOREIGN KEY (id_horario) REFERENCES Horario (id_horario));

CREATE TABLE Horario(
id_horario INT NOT NULL PRIMARY KEY,
bloque VARCHAR(5) NOT NULL,
dia CHAR(10) NOT NULL,
mes CHAR(10) NOT NULL,
an_o CHAR(2) NOT NULL,
id_semestre CHAR(2) NOT NULL,
FOREIGN KEY (an_o) REFERENCES Semestre (an_o),
FOREIGN KEY (id_semestre) REFERENCES Semestre (id_semestre)); <------- Aqui me da otro error

CREATE TABLE Asignacion_Recurso(
id_asignacion CHAR(2) NOT NULL,
id_recurso CHAR(2) NOT NULL,
PRIMARY KEY (id_asignacion, id_recurso),
estado_devolucion CHAR(1) NOT NULL,
FOREIGN KEY (id_asignacion) REFERENCES Asignacion (id_asignacion),
FOREIGN KEY (id_recurso) REFERENCES Recurso (id_recurso));

CREATE TABLE Recurso(
id_recurso CHAR(2) NOT NULL PRIMARY KEY,
nombre_recurso VARCHAR(20) NOT NULL,
tipo_recurso VARCHAR(20) NOT NULL,
estado VARCHAR(10) NOT NULL);

CREATE TABLE Sala(
id_sala CHAR(2) NOT NULL PRIMARY KEY,
edificio CHAR(1) NOT NULL,
numero CHAR(3) NOT NULL,
capacidad CHAR(3) NOT NULL);

Estoy usando Postgresql 8.1 y he revisado por todos lados tratando de encontrar la respuesta pero no la veo, si alguien aqui me puede ayudar me salvaria de reprobar la tarea xD.

Salu2!

Última edición por v4mp1r0; 23/03/2008 a las 19:25
  #2 (permalink)  
Antiguo 23/03/2008, 23:08
 
Fecha de Ingreso: enero-2008
Mensajes: 25
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: ERROR: no hay restricción unique que coincida con las tablas referida

Hola, como andas!

En primer lugar, estas haciendo dos referencias por separado en la tabla CURSO:

Código:
CREATE TABLE Curso(
    id_curso CHAR(2) NOT NULL PRIMARY KEY,
    sigla CHAR(7) NOT NULL,
    nombre_curso VARCHAR(25),
    departamento VARCHAR(20) NOT NULL,
    creditos CHAR(1) NOT NULL,
    numero_inscritos INT NOT NULL,
    rut CHAR(10) NOT NULL,
    an_o CHAR(2) NOT NULL,
    id_semestre CHAR(2) NOT NULL,

    FOREIGN KEY (rut) REFERENCES Profesor (rut),
    FOREIGN KEY (an_o) REFERENCES Semestre (an_o),
    FOREIGN KEY (id_semestre) REFERENCES Semestre (id_semestre)
);
Uno a la clave parcial an_o de la tabla Semetre y la otra a la clave parcial id_semestre de misma tabla. Con lo cual, es necesario que tengas dos UNIQUE Constraint separados en la tabla Semestre (uno para cada atributo). Si no es tu intencion, lo correcto seria que hagas:

Código:
CREATE TABLE Curso(
    id_curso CHAR(2) NOT NULL PRIMARY KEY,
    sigla CHAR(7) NOT NULL,
    nombre_curso VARCHAR(25),
    departamento VARCHAR(20) NOT NULL,
    creditos CHAR(1) NOT NULL,
    numero_inscritos INT NOT NULL,
    rut CHAR(10) NOT NULL,
    an_o CHAR(2) NOT NULL,
    id_semestre CHAR(2) NOT NULL,

    FOREIGN KEY (rut) REFERENCES Profesor (rut),
    FOREIGN KEY (an_o, id_semestre) REFERENCES Semestre (an_o, id_semestre)
);

En la tabla Horario sucede lo mismo.

Por ultimo, revisa el orden de creacion de las tablas porque estas haciendo referencia a Sala (en la definicion de Asignacion ) antes de crear la tabla Sala. (y otras mas...)


Saludos!
  #3 (permalink)  
Antiguo 24/03/2008, 06:27
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 2 meses
Puntos: 13
Re: ERROR: no hay restricción unique que coincida con las tablas referida

Cita:
Iniciado por bransh Ver Mensaje
Hola, como andas!

Uno a la clave parcial an_o de la tabla Semetre y la otra a la clave parcial id_semestre de misma tabla. Con lo cual, es necesario que tengas dos UNIQUE Constraint separados en la tabla Semestre (uno para cada atributo). Si no es tu intencion, lo correcto seria que hagas:

Saludos!
Lo siento bransh pero no es del todo correcto.
Lo que necesitaría es crear un UNIQUE de los dos campos, no dos UNIQUE por separado. Aunque, como bien dices, en realidad no es necesario porque los campos a referenciar son PK.

Cita:
Ademas de darme el error no me crea otras tablas: curso, asignacion, horario, recurso y asignacion_recursos, horario. Aqui les dejo las definiciones usadas.
Lógico si falla al crear tabla CURSO no te la puede crear, si despues creas Ayudantia que referencia una tabla que no existe --> ERROR!
...
...
...

Debes referencias el semestre asi:
FOREIGN KEY (an_o, id_semestre) REFERENCES Semestre (ano_d, id_semestre));

Si lo piensas, al referenciar un semestre de la forma que intentas... de que año es el semestre?
Si tienes el semestre 1 en 5 años a que registro te refieres, como lo adivina la BD?

A parte de los errores, deberias de revisar tu diseño y usar más integer y menos char (sobre todo para las PK- FK)

Si no entiendes algo, pregunta!
Salu2

Última edición por seyko; 24/03/2008 a las 06:35
  #4 (permalink)  
Antiguo 24/03/2008, 10:43
 
Fecha de Ingreso: enero-2008
Mensajes: 25
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: ERROR: no hay restricción unique que coincida con las tablas referida

Mi estimado Seyko, a ver... parece que ultimamente escribo de una manera poco comprensible para ud.

Cuand dije:

Cita:
Uno a la clave parcial an_o de la tabla Semetre y la otra a la clave parcial id_semestre de misma tabla. Con lo cual, es necesario que tengas dos UNIQUE Constraint separados en la tabla Semestre (uno para cada atributo). Si no es tu intencion, lo correcto seria que hagas:
me referia a algo asi como:

Código:
CREATE TABLE Semestre(
    an_o CHAR(2) NOT NULL,
    id_semestre CHAR(2) NOT NULL,
    fecha_inicio DATE,
    fecha_termino DATE,

    PRIMARY KEY (an_o, id_semestre),
    UNIQUE(an_o),
    UNIQUE(id_semestre)
);
Y de esa manera, la creacion de la tabla curso:

Código:
CREATE TABLE Curso(
    id_curso CHAR(2) NOT NULL PRIMARY KEY,
    sigla CHAR(7) NOT NULL,
    nombre_curso VARCHAR(25),
    departamento VARCHAR(20) NOT NULL,
    creditos CHAR(1) NOT NULL,
    numero_inscritos INT NOT NULL,
    rut CHAR(10) NOT NULL,
    an_o CHAR(2) NOT NULL,
    id_semestre CHAR(2) NOT NULL,

    FOREIGN KEY (rut) REFERENCES Profesor (rut),
    FOREIGN KEY (an_o) REFERENCES Semestre (an_o),
    FOREIGN KEY (id_semestre) REFERENCES Semestre (id_semestre)
);
Tal cual la hacia el amigo v4mp1r0, funcionaria correctamente.

Espero se entienda esta vez.

Saludos
  #5 (permalink)  
Antiguo 24/03/2008, 11:14
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 2 meses
Puntos: 13
Re: ERROR: no hay restricción unique que coincida con las tablas referida

jeje parece que no nos entendemos bien, pero lo llevamos bien ;)

Código:
CREATE TABLE Semestre(
    an_o CHAR(2) NOT NULL,
    id_semestre CHAR(2) NOT NULL,
    fecha_inicio DATE,
    fecha_termino DATE,

    PRIMARY KEY (an_o, id_semestre),
    UNIQUE(an_o),
    UNIQUE(id_semestre)
);
Sigo diciendo que esto no es correcto.
Por la siguiente razon, una PK automaticamente lleva un UNIQUE a todos los campos que la forman, en este caso (an_o, id_semestre).
Si despues añadimos dos UNIQUES separados el comportamiento no será el esperado.
Ejemplo
an_o id_semestre
1 1
1 2 <-- Aqui falla el año
2 1 <-- Aqui falla el semestre

Si no estoy en lo correcto, una critica constructiva siempre es bien recibida.

Un saludo
  #6 (permalink)  
Antiguo 24/03/2008, 11:23
 
Fecha de Ingreso: enero-2008
Mensajes: 25
Antigüedad: 16 años, 3 meses
Puntos: 0
Re: ERROR: no hay restricción unique que coincida con las tablas referida

Efectivamente Seyko, es ta cual lo decis. Y es por eso que di por sentado que v4mp1r0 entendia la diferencia, cuando dije:

"Si no es tu intencion, lo correcto seria que hagas:"


Igualmente, como decis, la llevamos bien jajaja

un gran abrazo para vos.
  #7 (permalink)  
Antiguo 25/03/2008, 06:50
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 2 meses
Puntos: 13
Re: ERROR: no hay restricción unique que coincida con las tablas referida

ok, se que tu lo entiendes. Dejo constacia para que Vampiro lo pille!

Nos vemos
  #8 (permalink)  
Antiguo 25/03/2008, 12:02
Avatar de v4mp1r0  
Fecha de Ingreso: febrero-2008
Mensajes: 36
Antigüedad: 16 años, 2 meses
Puntos: 0
Re: ERROR: no hay restricción unique que coincida con las tablas referida

Gracias muchachos, hice lo que me indicaron y me resulto de lujo, eso si tuve que cambiar el orden en la creacion de las tablas por que habian algunas a las que se hacia referencia sin ser creadas, tal como lo indico bransh. Gracias por vuestra ayuda.

Salu2!
  #9 (permalink)  
Antiguo 03/03/2010, 16:05
 
Fecha de Ingreso: febrero-2008
Mensajes: 13
Antigüedad: 16 años, 2 meses
Puntos: 0
Respuesta: Re: ERROR: no hay restricción unique que coincida con las tablas referida

oye muy buena respuesta, tenia ese mismo problema y gracias a tu respuesta lo solucione, gracias
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

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 17:47.