Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > Firebird e Interbase
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 14-10-2025
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Ubicación: Toledo - España
Posts: 1.418
Poder: 21
Angel.Matilla Va por buen camino
Problemas con un foreign key

Buenas tardes a todos.

Tengo un problema con la definición de un FOREIGN KEY. Tengo esta tabla:
Código SQL [-]
CREATE TABLE TIPOIVA (
  NOMBRE VARCHAR(30) CHARACTER SET ISO8859_1 NOT NULL COLLATE ES_ES_CI_AI,
  PORIVA NUMERIC(4, 2) DEFAULT 0);

CREATE UNIQUE INDEX TIPIVA ON TIPOIVA(PORIVA);
y quiero crear un FOREIGN KEY sobre esta otra tabla:
Código SQL [-]
CREATE TABLE ARTICULO (
  CODIGO INTEGER NOT NULL,
  REFERENCIA VARCHAR(25) CHARACTER SET ISO8859_1 NOT NULL COLLATE ES_ES_CI_AI,
  CODBAR VARCHAR(15) CHARACTER SET ISO8859_1 COLLATE ES_ES_CI_AI,
  NOMBRE VARCHAR(60) CHARACTER SET ISO8859_1 COLLATE ES_ES_CI_AI,
  FAMILIA INTEGER DEFAULT 1,
  PROVEEDOR INTEGER DEFAULT 1,
  PRECOSTE NUMERIC(10, 4),
  PREBRUTO NUMERIC(10, 4),
  TIPOIVA INTEGER,
  PREVENTA NUMERIC(10, 4),
  STOCK INTEGER,
  MINIMO INTEGER DEFAULT 0,
  CONTROL SMALLINT DEFAULT 0);
con este código:
Código SQL [-]
ALTER TABLE ARTICULO ADD CONSTRAINT FK_ARTIVA FOREIGN KEY (TIPOIVA) REFERENCES TIPOIVA(PORIVA)
pero me da este error:
Cita:
Unsuccessful metadata update.
Could not find UNIQUE or PRIMARY KEY constraint in table TIPOIVA with specified columns.

SQL Code: -607
IB Error Number: 335544351
y no acabo de ver donde está el problema porque la columna que uso para la clave externa tien un ínidca único.
Responder Con Cita
  #2  
Antiguo 14-10-2025
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.669
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Puede que esté confundiendo el nombre del campo con el de la tabla, los dos se llaman igual.
Responder Con Cita
  #3  
Antiguo 14-10-2025
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Ubicación: Toledo - España
Posts: 1.418
Poder: 21
Angel.Matilla Va por buen camino
Cita:
Empezado por Casimiro Noteví Ver Mensaje
Puede que esté confundiendo el nombre del campo con el de la tabla, los dos se llaman igual.
No te digo que no, pero ese código que he puesto lo ha genera SQL Manager y si estuviera mal ni lo generaría. Además, los campos no se llaman igual: uno es TipoIva y el Otro PorIva.

Por otra parte, el mensaje que da el motor me dice que No se pudo encontrar la restricción CLAVE ÚNICA o PRIMARIA en la tabla TIPOIVA con las columnas especificadas, y la clave única está definida; no es primaria, pero es única. Tal vez si cambio la definición del índice solucione el problema.
Responder Con Cita
  #4  
Antiguo 14-10-2025
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.669
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
¿Tienes datos ya y alguno repetido?
Responder Con Cita
  #5  
Antiguo 14-10-2025
Avatar de Casimiro Noteví
Casimiro Noteví Casimiro Noteví is offline
Merodeador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.669
Poder: 10
Casimiro Noteví Tiene un aura espectacularCasimiro Noteví Tiene un aura espectacular
Ah, vale, es que has creado un índice único, y no un "constraint", además no tienes clave primaria.


Crea un "constraint"
Código SQL [-]
ALTER TABLE TIPOIVA ADD CONSTRAINT UQ_TIPOIVA_PORIVA UNIQUE(PORIVA);


O también:
Código SQL [-]
CREATE TABLE TIPOIVA (
  NOMBRE VARCHAR(30) CHARACTER SET ISO8859_1 NOT NULL COLLATE ES_ES_CI_AI,
  PORIVA NUMERIC(4, 2) DEFAULT 0,
  CONSTRAINT UQ_TIPOIVA_PORIVA UNIQUE(PORIVA)
);


Luego:
Código SQL [-]
ALTER TABLE ARTICULO
  ADD CONSTRAINT FK_ARTICULO_TIPOIVA
  FOREIGN KEY (TIPOIVA)
  REFERENCES TIPOIVA(PORIVA);
Responder Con Cita
  #6  
Antiguo 14-10-2025
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Ubicación: Toledo - España
Posts: 1.418
Poder: 21
Angel.Matilla Va por buen camino
Cita:
Empezado por Casimiro Noteví Ver Mensaje
¿Tienes datos ya y alguno repetido?
No, las tablas están vacías.
Responder Con Cita
  #7  
Antiguo 14-10-2025
lucho6007 lucho6007 is offline
Miembro
 
Registrado: ene 2009
Ubicación: Junín, pcia de BsAs, Argentina
Posts: 86
Poder: 18
lucho6007 Va por buen camino
Hola a todos!
Por lo que veo, la tabla Articulo tiene un campo que se llama TipoIVA, y luego está la tabla que se llama TipoIVA.
Que a lo mejor se está confundiendo el campo con la tabla (o al revés...).


Saludos
Responder Con Cita
  #8  
Antiguo 15-10-2025
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Poder: 22
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Antes que nada, los dos campos deberían tener el mismo tipo.
  • TIPOIVA.PORIVA --> NUMERIC(4,2)
  • ARTICULO.PORIVA --> INTEGER

Además, el campo destino de la FK deberá ser PK de la otra tabla.
En concreto: TIPOIVA.PORIVA debe ser PK
Responder Con Cita
  #9  
Antiguo 15-10-2025
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.806
Poder: 22
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
He hecho esta prueba que funciona:

Código SQL [-]
CREATE TABLE TIPOIVA (
    NOMBRE  VARCHAR(30) CHARACTER SET ISO8859_1 NOT NULL COLLATE ES_ES_CI_AI,
    PORIVA  NUMERIC(4,2) DEFAULT 0 /*--->*/ NOT NULL /*<---*/
);
commit work;

/* Debe ser PK para poder ser referenicada por FKs */
ALTER TABLE TIPOIVA ADD CONSTRAINT PK_TIPOIVA PRIMARY KEY (PORIVA);
commit work;

CREATE TABLE ARTICULO (
    CODIGO      INTEGER NOT NULL,
    REFERENCIA  VARCHAR(25) CHARACTER SET ISO8859_1 NOT NULL COLLATE ES_ES_CI_AI,
    CODBAR      VARCHAR(15) CHARACTER SET ISO8859_1 COLLATE ES_ES_CI_AI,
    NOMBRE      VARCHAR(60) CHARACTER SET ISO8859_1 COLLATE ES_ES_CI_AI,
    FAMILIA     INTEGER DEFAULT 1,
    PROVEEDOR   INTEGER DEFAULT 1,
    PRECOSTE    NUMERIC(15,4),
    PREBRUTO    NUMERIC(15,4),
    TIPOIVA     /*--->*/ NUMERIC(4,2) DEFAULT 0 /*<---*/ ,
    PREVENTA    NUMERIC(15,4),
    STOCK       INTEGER,
    MINIMO      INTEGER DEFAULT 0,
    CONTROL     SMALLINT DEFAULT 0
);
commit work;

ALTER TABLE ARTICULO ADD CONSTRAINT FK_ARTIVA FOREIGN KEY (TIPOIVA) REFERENCES TIPOIVA (PORIVA);
commit work;
Responder Con Cita
  #10  
Antiguo 15-10-2025
Avatar de Angel.Matilla
Angel.Matilla Angel.Matilla is offline
Miembro
 
Registrado: ene 2007
Ubicación: Toledo - España
Posts: 1.418
Poder: 21
Angel.Matilla Va por buen camino
Gracias a todos.

Cita:
Empezado por Casimiro Noteví Ver Mensaje
Código SQL [-]
ALTER TABLE TIPOIVA ADD CONSTRAINT UQ_TIPOIVA_PORIVA UNIQUE(PORIVA);
Así funciona a la perfección. Gracias.

Cita:
Empezado por duilioisola Ver Mensaje
He hecho esta prueba que funciona:
Tienes toda la razón. Me da lo mismo crear un índice único que una clave primaria. Tengo que repasar el diseño de la base de datos.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Uso de Foreign Key en FB 2.5 Angel.Matilla Firebird e Interbase 3 06-08-2015 21:05:10
Problemas inserción de registros en IBDataset maestro-detalle y Foreign Key Luis F. Orjuela Conexión con bases de datos 13 24-07-2013 22:11:32
foreign key clanmilano Conexión con bases de datos 4 03-11-2005 03:21:19
Foreign key fjardelphi Firebird e Interbase 2 20-12-2004 16:05:39
uso de FOREIGN KEY jzginez Firebird e Interbase 2 22-04-2004 23:20:25


La franja horaria es GMT +2. Ahora son las 21:06:42.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi