Postgresql inheritance and foreign key referencing parent table

I have already documented this and read about it by other users, but in my case the link should work fine: I have several tables extending one table "entity" and the table "association" that refers only to "entity", Table. Therefore, I refer only to the parent table, which owns every other table identifier. Why did I get the following then?

ERROR: insert or update on table "association" violates foreign key constraint "association_id1_fkey" DETAIL: Key (id1)=(1) is not present in table "entity". 

Here is the circuit I'm using.

 CREATE TABLE entity ( id serial primary key, created_at int, updated_at int, deleted_at int ); CREATE TABLE association ( id1 int references entity(id) on delete cascade on update cascade, atype varchar, id2 int references entity(id) on delete cascade on update cascade, created_at int, deleted_at int ); CREATE TABLE "user" ( first_name varchar(255), last_name varchar(255) )INHERITS(entity); CREATE TABLE "pet" ( name varchar(255) )INHERITS(entity); INSERT INTO "user" (first_name) VALUES ('damiano'); INSERT INTO "user" (first_name) VALUES ('francesco'); INSERT INTO "user" (first_name) VALUES ('romolo'); INSERT INTO "pet" (name) VALUES ('baloo'); INSERT INTO "pet" (name) VALUES ('micia'); INSERT INTO "pet" (name) VALUES ('ioria'); INSERT INTO "association" VALUES (1, 'pets', 4, 0, 0); INSERT INTO "association" VALUES (1, 'pets', 5, 0, 0); INSERT INTO "association" VALUES (2, 'pets', 4, 0, 0); INSERT INTO "association" VALUES (2, 'pets', 5, 0, 0); INSERT INTO "association" VALUES (3, 'pets', 6, 0, 0); 

The rows are inserted correctly:

 testing=# select * from "entity"; id | created_at | updated_at | deleted_at ----+------------+------------+------------ 1 | | | 2 | | | 3 | | | 4 | | | 5 | | | 6 | | | (6 rows) testing=# select * from "user"; id | created_at | updated_at | deleted_at | first_name | last_name ----+------------+------------+------------+------------+----------- 1 | | | | damiano | 2 | | | | francesco | 3 | | | | romolo | (3 rows) testing=# select * from "pet"; id | created_at | updated_at | deleted_at | name ----+------------+------------+------------+------- 4 | | | | baloo 5 | | | | micia 6 | | | | ioria (3 rows) testing=# 
0
source share
1 answer

The parent table does not contain all the data from the inherited tables. Choosing from this table has a UNION value over legacy tables.

Compare these:

 SELECT * FROM "entity"; SELECT * FROM ONLY "entity"; 

This is why inheritance is no longer used.

0
source

Source: https://habr.com/ru/post/1244592/


All Articles