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

Clave Foranea

Estas en el tema de Clave Foranea en el foro de PostgreSQL en Foros del Web. hola amigos, me encuentro haciendo una base de datos y cunado intento hacer una clave foranea entre dos tablas me dice lo siguiente: ERROR: there ...
  #1 (permalink)  
Antiguo 07/01/2008, 14:10
 
Fecha de Ingreso: enero-2003
Ubicación: Caracas
Mensajes: 439
Antigüedad: 21 años, 3 meses
Puntos: 0
Clave Foranea

hola amigos, me encuentro haciendo una base de datos y cunado intento hacer una clave foranea entre dos tablas me dice lo siguiente:

ERROR: there is not unique constraint matching given keys for referenced table "visitantes".

la rpimera tabla "visitantes"

CREATE TABLE visitantes.visitantes
(
cedula integer NOT NULL, -- cedula del visitante.
nombre character varying(50) NOT NULL, -- nombre del visitante.
apellido character varying(50) NOT NULL, -- apellido del visitate.
organismo character varying(255) NOT NULL, -- organismo al cual representa.
imagen character varying(20) NOT NULL, -- foto del visitantel.
contacto integer NOT NULL, -- cedula de la persona de contacto con la institucion.
entrada time without time zone NOT NULL, -- hora de entrada a la institucion.
salida time without time zone, -- salida del visitante de la insitucion.
num_pase character(4) NOT NULL, -- numero de pase asignado.
CONSTRAINT visitantes_pkey PRIMARY KEY (cedula, entrada),
CONSTRAINT visitantes_contacto_fkey FOREIGN KEY (contacto)
REFERENCES acceso.empleado (cedula) MATCH FULL
ON UPDATE CASCADE ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED,
CONSTRAINT visitantes_num_pase_fkey FOREIGN KEY (num_pase)
REFERENCES visitantes.pases (num_pase) MATCH FULL
ON UPDATE CASCADE ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED
)

segunda tabla "activacion"

CREATE TABLE visitantes.activacion
(
cedula integer NOT NULL, -- cedula del visitante.
num_pase character(4) NOT NULL, -- numero de pase que le fue asiganado a dicho visitante.
fecha date NOT NULL, -- fecha en la que se realizo la accion.
activo boolean NOT NULL, -- indica si dicho pase esta activo o no.
CONSTRAINT activacion_pkey PRIMARY KEY (cedula, fecha),
CONSTRAINT activacion_num_pase_fkey FOREIGN KEY (num_pase)
REFERENCES visitantes.pases (num_pase) MATCH FULL
ON UPDATE CASCADE ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED
)

yo quiero hacer una clave foranea entre el campo cedula de la tbla visitantes con el campo cedula de la tabla activacion.


gracias de antemano, salu2.
  #2 (permalink)  
Antiguo 07/01/2008, 16:27
 
Fecha de Ingreso: agosto-2005
Ubicación: Mérida, Venezuela
Mensajes: 732
Antigüedad: 18 años, 8 meses
Puntos: 7
Re: Clave Foranea

Saludos Fabian

Cita:
Iniciado por Fabian olmos Ver Mensaje
ERROR: there is not unique constraint matching given keys for referenced table "visitantes".
El campo clave, que vas a referenciar como clave ajena/foránea, debe ser llave unica (unique key).

Normalmente, sí el campo clave es serial, al crearlo, automágicamente la crea como llave unica, no así cuando es otro tipo de dato, por lo que se debe tener presente al momento de crearla, lamentablemente, no puedes hacer un alter para agregar/eliminar un unique key a un campo, ni desde psql, ni phppgadmin ni pgadmin3, así que te toca borrar la tabla y volver a crearla...

Pendientes!
__________________
Gracias de todas todas
-----
Linux!
  #3 (permalink)  
Antiguo 08/01/2008, 06:55
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 3 meses
Puntos: 13
Re: Clave Foranea

Cita:
El campo clave, que vas a referenciar como clave ajena/foránea, debe ser llave unica (unique key).
Correcto, como te dice cacr debes la clave a referenciar debe ser única logicamente, sino a que registro referencia???

Cita:
Normalmente, sí el campo clave es serial, al crearlo, automágicamente la crea como llave unica, no así cuando es otro tipo de dato, por lo que se debe tener presente al momento de crearla, lamentablemente, no puedes hacer un alter para agregar/eliminar un unique key a un campo, ni desde psql, ni phppgadmin ni pgadmin3, así que te toca borrar la tabla y volver a crearla...
Incorrecto, primero un campo serial te crea una secuencia y le da un valor por defecto al campo donde se crea, NO tiene nada que ver con una PK ni con unique, otro tema es que normalmente al campo de PK se crea con un "tipo" serial.

En segundo lugar si que puedes agregar/eliminar un unique key a un campo con un alter!!

Un saludo
  #4 (permalink)  
Antiguo 08/01/2008, 07:15
 
Fecha de Ingreso: agosto-2005
Ubicación: Mérida, Venezuela
Mensajes: 732
Antigüedad: 18 años, 8 meses
Puntos: 7
Re: Clave Foranea

Saludos Seyko

Cita:
Iniciado por seyko Ver Mensaje
Incorrecto, primero un campo serial te crea una secuencia y le da un valor por defecto al campo donde se crea, NO tiene nada que ver con una PK ni con unique, otro tema es que normalmente al campo de PK se crea con un "tipo" serial.
Al crear un campo serial, este resuelve "automágicamente" ser un campo unique key y not null, no hay que especificarlo, pero así se crea... por eso lo de "automágicamente".

Cita:
Iniciado por seyko Ver Mensaje
En segundo lugar si que puedes agregar/eliminar un unique key a un campo con un alter!!
Previo a responder, miré:

Código:
pruebas=# \h ALTER TABLE
Comando:     ALTER TABLE
Descripción: cambia la definición de una tabla
Sintaxis:
ALTER TABLE [ ONLY ] nombre [ * ]
    acción [, ... ]
ALTER TABLE [ ONLY ] nombre [ * ]
    RENAME [ COLUMN ] columna TO nueva_columna
ALTER TABLE nombre
    RENAME TO nuevo_nombre
ALTER TABLE nombre
    SET SCHEMA nuevo_nombre

donde acciónes una de:

    ADD [ COLUMN ] columna tipo [ restricción_de_columna [ ... ] ]
    DROP [ COLUMN ] columna [ RESTRICT | CASCADE ]
    ALTER [ COLUMN ] columna TYPE type [ USING expresión ]
    ALTER [ COLUMN ] columna SET DEFAULT expresión
    ALTER [ COLUMN ] columna DROP DEFAULT
    ALTER [ COLUMN ] columna { SET | DROP } NOT NULL
    ALTER [ COLUMN ] columna SET STATISTICS entero
    ALTER [ COLUMN ] columna SET STORAGE { PLAIN | EXTERNAL | EXTENDED | MAIN }
    ADD restricción_de_tabla
    DROP CONSTRAINT nombre_de_restricción [ RESTRICT | CASCADE ]
    DISABLE TRIGGER [ nombre_disparador | ALL | USER ]
    ENABLE TRIGGER [ nombre_disparador  | ALL | USER ]
    CLUSTER ON nombre_índice
    SET WITHOUT CLUSTER
    SET WITHOUT OIDS
    OWNER TO nuevo_dueño
    SET TABLESPACE nueva_tablespace
al no ver nada explícito que me indicara que podía agregar/eliminar un unique key, pues, respondí... y la verdad, sigo sin saber por dónde va....?
__________________
Gracias de todas todas
-----
Linux!
  #5 (permalink)  
Antiguo 08/01/2008, 11:20
 
Fecha de Ingreso: febrero-2007
Mensajes: 1.292
Antigüedad: 17 años, 3 meses
Puntos: 13
Re: Clave Foranea

Buenas cacr!

Cita:
Al crear un campo serial, este resuelve "automágicamente" ser un campo unique key y not null, no hay que especificarlo, pero así se crea... por eso lo de "automágicamente".
Lo siento, pero sigue siendo incorrecto.
Código:
pruebas=# create table prueba (id serial);
NOTICE:  CREATE TABLE creará una secuencia implícita «prueba_id_seq» para la columna serial «prueba.id»
CREATE TABLE
pruebas=# insert into prueba values (1);
INSERT 0 1
pruebas=# insert into prueba values (1);
INSERT 0 1
pruebas=# select * from prueba;
 id
----
  1
  1
(2 filas)
Como ves no es un campo UNIQUE



Código:
pruebas=# truncate table prueba;
TRUNCATE TABLE
pruebas=# select * from prueba;
 id
----
(0 filas)

pruebas=# insert into prueba values (1);
INSERT 0 1
pruebas=# insert into prueba values (2);
INSERT 0 1
pruebas=# alter table prueba add unique (id);
NOTICE:  ALTER TABLE / ADD UNIQUE creará el índice implícito «prueba_id_key» para la tabla «prueba»
ALTER TABLE
pruebas=#
Asi se pone a UNIQUE con alter table, cambias add por drop y borras.

Un saludo
  #6 (permalink)  
Antiguo 08/01/2008, 13:39
 
Fecha de Ingreso: agosto-2005
Ubicación: Mérida, Venezuela
Mensajes: 732
Antigüedad: 18 años, 8 meses
Puntos: 7
Re: Clave Foranea

mmm, por eso digo, todo los días se aprende algo nuevo

thanks amigo seyko
__________________
Gracias de todas todas
-----
Linux!
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 11:11.