Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Uso de Foreign Key en FB 2.5

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Bases de Datos
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Uso de Foreign Key en FB 2.5 Responder citando

Haciendo unas pruebas en una base de datos definida en FB 2.5 creo que me he dado cuenta que debo tener un error de concepto. Dos de las tablas de esta base de datos están definidas así:
Código:
CREATE TABLE PERSONA (
  APELLIDOS VARCHAR(40) NOT NULL,
  NOMBRE VARCHAR(15) NOT NULL,
  REGISTRO INTEGER NOT NULL,
  CODPRV SMALLINT NOT NULL,
  NIF VARCHAR(9),
  SEXO SMALLINT,
  F_NACIM DATE,
  DOMICILIO VARCHAR(50),
  CPOSTAL VARCHAR(5),
  MUNICIPIO INTEGER,
  PROVINCIA SMALLINT,
  PROFESION INTEGER,
  C_ELECTRONICO VARCHAR(60),
  TELEFONO_1 VARCHAR(9),
  TELEFONO_2 VARCHAR(9),
  TELEFONO_3 VARCHAR(9),
  SITUACION SMALLINT,
  CORREO SMALLINT,
  LO1599 SMALLINT,
  F_ALTA DATE,
  N_AFILIADO INTEGER,
  AFILIACION SMALLINT,
  JUNTA SMALLINT,
  REFERENCIA VARCHAR(12),
  PERPAGO SMALLINT,
  FORPAGO SMALLINT,
  CUOTA DECIMAL(9, 2),
  IBAN VARCHAR(4),
  CUENTA VARCHAR(30),
  BIC VARCHAR(11),
  OBSERVACIONES BLOB SUB_TYPE 1);

ALTER TABLE PERSONA ADD CONSTRAINT PK_PERSONA PRIMARY KEY (APELLIDOS,NOMBRE,REGISTRO,CODPRV);
ALTER TABLE PERSONA ADD CONSTRAINT FK_CODAFIPER FOREIGN KEY (CODPRV,AFILIACION) REFERENCES AFILIACION(CODPRV,CODIGO) ON DELETE SET NULL;
ALTER TABLE PERSONA ADD CONSTRAINT FK_CODJUNPER FOREIGN KEY (CODPRV,JUNTA) REFERENCES JUNTA(CODPRV,CODIGO) ON DELETE SET NULL ON UPDATE CASCADE;
ALTER TABLE PERSONA ADD CONSTRAINT FK_CODMUNPER FOREIGN KEY (CODPRV,MUNICIPIO) REFERENCES POBLACION(CODPRV,CODIGO) ON DELETE SET NULL;
ALTER TABLE PERSONA ADD CONSTRAINT FK_CODPROPER FOREIGN KEY (CODPRV,PROFESION) REFERENCES PROFESION(CODPRV,CODIGO) ON DELETE SET NULL;
ALTER TABLE PERSONA ADD CONSTRAINT FK_CODPRVPER FOREIGN KEY (PROVINCIA) REFERENCES PROVINCIA(CODIGO) ON DELETE SET NULL;

CREATE INDEX AFIPER ON PERSONA(CODPRV,AFILIACION);
CREATE INDEX APENOMPER ON PERSONA(CODPRV,APELLIDOS,NOMBRE);
CREATE INDEX CTAPER ON PERSONA(CODPRV,IBAN,CUENTA);
CREATE INDEX JUNPER ON PERSONA(CODPRV,JUNTA);
CREATE INDEX MUNPER ON PERSONA(CODPRV,MUNICIPIO);
CREATE UNIQUE INDEX NUMREG ON PERSONA(CODPRV,REGISTRO);
CREATE INDEX PROPER ON PERSONA(CODPRV,PROFESION);
Código:
CREATE TABLE JUNTA (
  CODPRV SMALLINT NOT NULL,
  CODIGO SMALLINT NOT NULL,
  NOMBRE VARCHAR(30) NOT NULL,
  ZONA SMALLINT,
  PARTIDO SMALLINT);

ALTER TABLE JUNTA ADD CONSTRAINT PK_JUNTA PRIMARY KEY (CODPRV,CODIGO);
ALTER TABLE JUNTA ADD CONSTRAINT FK_CODPARJUN FOREIGN KEY (CODPRV,PARTIDO) REFERENCES PARTIDO(CODPRV,CODIGO) ON DELETE SET NULL;
ALTER TABLE JUNTA ADD CONSTRAINT FK_CODZONJUN FOREIGN KEY (CODPRV,ZONA) REFERENCES ZONA(CODPRV,CODIGO) ON DELETE SET NULL;

CREATE INDEX NOMJUN ON JUNTA(CODPRV,NOMBRE);
Yo tenía la idea que con la definición
Código:
ALTER TABLE PERSONA ADD CONSTRAINT FK_CODJUNPER
FOREIGN KEY (CODPRV,JUNTA) REFERENCES JUNTA(CODPRV,CODIGO)
ON DELETE SET NULL ON UPDATE CASCADE;
al modificar el campo código en la tabla JUNTA se actualizaba el equivalente en la tabla PERSONA. ¿Estoy equivocado?

Si no estoy equivocado teóricamente si borro un campo de la tabla JUNTA debería ponerse a NULL el equivalente en la tabla PERSONA; sin embargo si trato de eliminar un registro de la tabla JUNTA me da un error:
Cita:
The insert failed because a column definition includes validation constraints.Validation error for column "PERSONA"."CODPRV", value "*** null ***".

Y no acabo de enteder el mensaje de error que me arroja. Entiendo que es porque el campo CODPRV trata de ponerse a nulo y es parte de la clave primaria; tendría que modificarse SÓLO el campo JUNTA de la tabla PERSONA ¿Cómo puedo hacerlo?
_________________
Un saludo

Necesitamos tu ayuda: Envía AI al 27595 (Coste 1,20 euros + IVA)
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email
Mensaje    Asunto: Responder citando

Hola Angel,

Yo esto lo utilizo en tablas tipicas de documentos que tienen cabecera y lineas. Ambas coinciden en la clave principal, en el caso de las lineas añade algun campo mas a esta clave. la tabla lineas seria la que tiene la "llave externa" y la tengo configurada en cascada en delete y updates.

Con esta configuracion si elemino un registro de la tabla cabecera automaticamente me eliminas los registros de la tabla lineas. Y en el caso del update si modifico un valor de la clave prinpal de cabecera me lo actualiza en lineas.

Yo imagino que el error que te da a ti simplemente es que no puedes poner un valor nulo en los campos de la clave principal que son por los que enlazan.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.