Problema de clave primaria multiple

publicado por: Anonymous

Tengo la tabla en la cual se encuentran 2 campos como claves primarias

CREATE TABLE public.productounidad
(
prod_cod character varying(30) NOT NULL,
uni_nombre character varying(100) NOT NULL,
pu_cantidad numeric(8,2) DEFAULT 0,
pu_minimo numeric(8,2) DEFAULT 0,
pu_maximo numeric(8,2) DEFAULT 0,
pu_costo numeric(8,2) DEFAULT 0,
pu_precionormal numeric(8,2) DEFAULT 0,
pu_precioespecial numeric(8,2) DEFAULT 0,
CONSTRAINT productounidad_pkey PRIMARY KEY (prod_cod, uni_nombre),
CONSTRAINT productounidad_prod_cod_fkey FOREIGN KEY (prod_cod)
  REFERENCES public.producto (prod_cod) MATCH SIMPLE
  ON UPDATE CASCADE ON DELETE NO ACTION,
CONSTRAINT productounidad_uni_nombre_fkey FOREIGN KEY (uni_nombre)
  REFERENCES public.unidad (uni_nombre) MATCH SIMPLE
  ON UPDATE CASCADE ON DELETE NO ACTION
)

y al referenciarlo en la siguiente tabla:

CREATE TABLE public.detalle
(
det_cod SERIAL PRIMARY KEY,
det_cod_prod character varying(30),
det_nombre_uni character varying(100),
det_cod_doc integer,
det_fecha date NOT NULL,
det_descrip character varying(40),
det_cant integer,
det_ing_egr character(1),
det_prec_comp numeric(10,2) DEFAULT 0,
det_prec_comp_t numeric(10,2) DEFAULT 0,
det_prec_vent numeric(10,2) DEFAULT 0,
det_existencia integer,
det_costo_prom numeric(10,2),
det_prec_vent_t numeric(10,2) DEFAULT 0,
det_desc integer,

CONSTRAINT detalle_det_cod_doc_fkey FOREIGN KEY (det_cod_doc)
  REFERENCES public.documento (doc_cod) MATCH SIMPLE
  ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT detalle_det_cod_prod_fkey FOREIGN KEY (det_cod_prod)
  REFERENCES public.productounidad (prod_cod) MATCH SIMPLE
  ON UPDATE NO ACTION ON DELETE NO ACTION,
CONSTRAINT detalle_det_nombre_uni_fkey FOREIGN KEY (det_nombre_uni)
  REFERENCES public.productounidad (uni_nombre) MATCH SIMPLE
  ON UPDATE NO ACTION ON DELETE NO ACTION
)

Me arroja el siguiente error :

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

Trate de añadir unique en la linea de primary key compuesta pero no me permite

solución

En este caso, me parece que tu intención es definir una clave foránea para la combinación de columnas (det_cod_prod, det_nombre_uni) que apunte a la llave primaria en la tabla productounidad. Eso sí se puede hacer.

Pero por separado, tal como lo haces, no es válido, porque las columnas individuales no son únicas en la tabla productounidad.

Reemplaza las 2 claves foráneas con solamente esta:

CONSTRAINT detalle_det_cod_prod_nombre_uni_fkey FOREIGN KEY (det_cod_prod, det_nombre_uni)
  REFERENCES public.productounidad (prod_cod, det_nombre_uni) MATCH SIMPLE
  ON UPDATE NO ACTION ON DELETE NO ACTION
Respondido por: Anonymous

Leave a Reply

Your email address will not be published. Required fields are marked *