Обсуждение: Problem about partitioned table
Hi everyone,
I have a problem with partitioned table in PostgreSql.
Actually I use the version 10. I created the partitioned table in test environment but face some problems with partitioned table constraint.
I google all about it last week and from the official site I get that version 11 will be released and that feature will be supported as I understand it.
From version 11 documentation
"Add support for
PRIMARY KEY, FOREIGN KEY, indexes, and triggers on partitioned tables"I install and configure yesterday as new 11 version released. And test it. Unfortunately I didn't achieve again.
Neither I don't understand the new feature nor this case is actually not supported.
Please help me about the problem.
In my test environment CASE is like that (I used the declarative partitioning)
I have a er_doc_to_user_relation table before. And I partitioned this table by list with column state.
I have created two partitions as following
CREATE TABLE xx.er_doc_to_user_state_1_3
PARTITION OF xx.er_doc_to_user_relation (oid,created_date,state,status,updated_date,branch_oid,state_update_date,user_position,
fk_action_owner,fk_action_owner_org,fk_document,fk_flow,fk_org,fk_prew_doc_user_rel,fk_user,fk_workflow,fk_action_login_type)
FOR VALUES IN (1,3);
CREATE TABLE xx.er_doc_to_user_state_2_4_9
PARTITION OF xx.er_doc_to_user_relation (oid,created_date,state,status,updated_date,branch_oid,state_update_date,user_position,
fk_action_owner,fk_action_owner_org,fk_document,fk_flow,fk_org,fk_prew_doc_user_rel,fk_user,fk_workflow,fk_action_login_type)
FOR VALUES IN (2,4,9);
After that I have created constraints and indexes for each partition manually. Everything is OK until here.
When I try to create constraint in another table which references er_doc_to_user_relation table.
Case 1: Try to create foreign key constraint reference to parent table er_doc_to_user_relation.
ALTER TABLE xx.er_doc_workflow_action
ADD CONSTRAINT fk_doc_work_act FOREIGN KEY (fk_to_user_doc_rel)
REFERENCES xx.er_doc_to_user_relation(oid) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION;
Following error occurred:
ERROR: cannot reference partitioned table "er_doc_to_user_relation"
SQL state: 42809
Because it is not supported so I try the second case as following.
Case 2: Try to create foreign key constraint reference to each partitioned table separately (er_doc_to_user_state_1_3, er_doc_to_user_state_2_4_9).
ALTER TABLE xx.er_doc_workflow_action
ADD CONSTRAINT fk_doc_work_act_1_3 FOREIGN KEY (fk_to_user_doc_rel)
REFERENCES xx.er_doc_to_user_state_1_3(oid) MATCH SIMPLE
ON UPDATE NO ACTION
ON DELETE NO ACTION;
Following error occurred:
ERROR: insert or update on table "er_doc_workflow_action" violates foreign key constraint "fk_doc_work_act_1_3"
DETAIL: Key (fk_to_user_doc_rel)=(3hjbzok1mn100g) is not present in table "er_doc_to_user_state_1_3". SQL state: 23503 I think this error is normal because oid which is referenced is in other partitioned table so it can't validate all data.
If I try to create foreign key constraint on second partition again same error will be occurred due to same reason.
Note: I want to create constraint only one-to-one column (fk_to_user_doc_rel - oid)
BIG QUESTION IS THAT
How can I solve this problem? What is your recommendations?
PLEASE HELP ME !!!
--
Best Regards,
Mehman Jafarov
DBA Aministrator at CyberNet LLC
On 10/19/18 2:03 AM, Mehman Jafarov wrote: > Hi everyone, > > I have a problem with partitioned table in PostgreSql. > Actually I use the version 10. I created the partitioned table in test > environment but face some problems with partitioned table constraint. > I google all about it last week and from the official site I get that > version 11 will be released and that feature will be supported as I > understand it. > From version 11 documentation > "/Add support for |PRIMARY KEY|, |FOREIGN KEY|, indexes, and triggers on > partitioned tables/" > I install and configure yesterday as new 11 version released. And test > it. Unfortunately I didn't achieve again. > Neither I don't understand the new feature nor this case is actually not > supported. > Please help me about the problem. As you found out: https://www.postgresql.org/docs/11/static/ddl-partitioning.html 5.10.2.3. Limitations "While primary keys are supported on partitioned tables, foreign keys referencing partitioned tables are not supported. (Foreign key references from a partitioned table to some other table are supported.)" > > Note: I want to create constraint only one-to-one column > (/fk_to_user_doc_rel - oid/) > > BIG QUESTION IS THAT > > How can I solve this problem? What is your recommendations? Well a FK is a form of a trigger, so maybe create your own trigger on the child table(s). > > *PLEASE HELP ME !!!* > > -- > */Best Regards,/* > */Mehman Jafarov/* > */DBA Aministrator at CyberNet LLC/* > */ > /* -- Adrian Klaver adrian.klaver@aklaver.com
On 10/19/18 2:03 AM, Mehman Jafarov wrote: > Hi everyone, > > I have a problem with partitioned table in PostgreSql. > Actually I use the version 10. I created the partitioned table in test > environment but face some problems with partitioned table constraint. > I google all about it last week and from the official site I get that > version 11 will be released and that feature will be supported as I > understand it. > From version 11 documentation > "/Add support for |PRIMARY KEY|, |FOREIGN KEY|, indexes, and triggers on > partitioned tables/" > I install and configure yesterday as new 11 version released. And test > it. Unfortunately I didn't achieve again. > Neither I don't understand the new feature nor this case is actually not > supported. > Please help me about the problem. As you found out: https://www.postgresql.org/docs/11/static/ddl-partitioning.html 5.10.2.3. Limitations "While primary keys are supported on partitioned tables, foreign keys referencing partitioned tables are not supported. (Foreign key references from a partitioned table to some other table are supported.)" > > Note: I want to create constraint only one-to-one column > (/fk_to_user_doc_rel - oid/) > > BIG QUESTION IS THAT > > How can I solve this problem? What is your recommendations? Well a FK is a form of a trigger, so maybe create your own trigger on the child table(s). > > *PLEASE HELP ME !!!* > > -- > */Best Regards,/* > */Mehman Jafarov/* > */DBA Aministrator at CyberNet LLC/* > */ > /* -- Adrian Klaver adrian.klaver@aklaver.com