Ver Mensaje Individual
  #4 (permalink)  
Antiguo 09/02/2016, 21:32
GreenBird
 
Fecha de Ingreso: octubre-2015
Mensajes: 17
Antigüedad: 9 años, 2 meses
Puntos: 0
Respuesta: Problema al insertar llave foránea

Luego de investigar por ahí creo que sé por dónde viene el error, aclarando que es mi primer proyecto que trabajo con postgresql y una de las cosas que me llamó la atención de este gestor es la psibilidad de particionar tablas, dejo una estructura más completa de lo que tengo, espero me orienten por favor:

Código SQL:
Ver original
  1. CREATE TABLE tb_mat_materia
  2. (
  3.   mat_id serial NOT NULL,
  4.   mat_materia CHARACTER VARYING(250),
  5.   CONSTRAINT tb_mat_materia_pkey PRIMARY KEY (mat_id)
  6. )
  7. WITH (
  8.   OIDS=FALSE
  9. );
  10. ALTER TABLE tb_mat_materia
  11.   OWNER TO admin;
  12.  
  13.  
  14. CREATE TABLE tb_ing_materia
  15. (
  16. -- Inherited from table tb_mat_materia:  mat_id integer NOT NULL DEFAULT nextval('tb_mat_materia_mat_id_seq'::regclass),
  17. -- Inherited from table tb_mat_materia:  mat_materia character varying(250)
  18. )
  19. INHERITS (tb_mat_materia)
  20. WITH (
  21.   OIDS=FALSE
  22. );
  23. ALTER TABLE tb_ing_materia
  24.   OWNER TO admin;
  25.  
  26. CREATE TABLE tb_evals_evaluaciones
  27. (
  28.   evals_id serial NOT NULL,
  29.   evals_eval_id INTEGER,
  30.   evals_fecha DATE,
  31.   evals_mat_id INTEGER,
  32.   evals_per_id INTEGER,
  33.   evals_prog_id INTEGER,
  34.   evals_hr_id INTEGER,
  35.   created_at TIMESTAMP(0) WITHOUT TIME zone NOT NULL,
  36.   updated_at TIMESTAMP(0) WITHOUT TIME zone NOT NULL,
  37.   CONSTRAINT tb_evals_evaluaciones_pkey PRIMARY KEY (evals_id),
  38.   CONSTRAINT tb_evals_evaluaciones_evals_hr_id_fkey FOREIGN KEY (evals_hr_id)
  39.       REFERENCES tb_hr_horario (hr_id) MATCH SIMPLE
  40.       ON UPDATE NO ACTION ON DELETE NO ACTION,
  41.   CONSTRAINT tb_evals_evaluaciones_evals_mat_id_fkey FOREIGN KEY (evals_mat_id)
  42.       REFERENCES tb_mat_materia (mat_id) MATCH SIMPLE
  43.       ON UPDATE NO ACTION ON DELETE NO ACTION,
  44.   CONSTRAINT tb_evals_evaluaciones_evals_per_id_fkey FOREIGN KEY (evals_per_id)
  45.       REFERENCES tb_per_personas (per_id) MATCH SIMPLE
  46.       ON UPDATE NO ACTION ON DELETE NO ACTION,
  47.   CONSTRAINT tb_evals_evaluaciones_evals_prog_id_fkey FOREIGN KEY (evals_prog_id)
  48.       REFERENCES tb_prog_programas (prog_id) MATCH SIMPLE
  49.       ON UPDATE NO ACTION ON DELETE NO ACTION
  50. )
  51. WITH (
  52.   OIDS=FALSE
  53. );
  54. ALTER TABLE tb_evals_evaluaciones
  55.   OWNER TO admin;


Como pueden observar tb_mat_materia es una tabla padre de tb_ing_materia, ahora bien, para poblar de datos incialmente lo he realizado por medio de inserts en la tabla tb_ing_materia y como es de esperarse al hacer un "select * from tb_mat_materia" se despliegan todos los registros incluído el registro 7.

Cosa que al ejecutar el:

Código SQL:
Ver original
  1. INSERT INTO tb_evals_evaluaciones (evals_eval_id,evals_fecha,evals_mat_id,evals_per_id,evals_prog_id,evals_hr_id,updated_at,created_at)
  2. VALUES (1, '10-02-2016', 7, 14, 1, 1, '2016-02-09 17:14:58', '2016-02-09 17:14:58')
Me devuelve:

Código SQL:
Ver original
  1. ERROR:  inserción o actualización en la tabla «tb_evals_evaluaciones» viola la llave FORánea «tb_evals_evaluaciones_evals_mat_id_fkey»
  2. DETALLE:  La llave (evals_mat_id)=(7) no está presente en la tabla «tb_mat_materia».

es decir que aunque la inserción en la tabla padre la he realizado por medio de la tabla hija, la relación (llave primaria - foránea ) la hago directamente en la tabla padre porque cuando quise hacerla en la tabla hija no pude.

Creo que estoy aplicando mal el concepto de herencia de tablas. será que no debo crear relaciones en este caso?

De hecho la única forma que me funcionó el insert fue eliminar la restricción:

Código SQL:
Ver original
  1. CONSTRAINT tb_evals_evaluaciones_evals_mat_id_fkey FOREIGN KEY (evals_mat_id)
  2.       REFERENCES tb_mat_materia (mat_id) MATCH SIMPLE

Viendo estoy creo que estoy concluyendo que no puedo ocupar llaves foráneas que son llaves primarias en tablas padres, en este caso sería de evaluar entonces a qué le doy más peso si a la integridad de los datos o la herencia?

me pueden orientar en este caso por favor?

Última edición por GreenBird; 10/02/2016 a las 12:10