If you have two tables with a foreign_key relationship, and you want to update the value of a primary key, postgresql will fail, telling you that there are associated tables with foreign keys to that value, so you can't break the consistency.
update subscription set cus_id=2 where cus_id=1;
DETAIL: Key (id)=(1) is still referenced from table "xxxxx".
LOCATION: ri_ReportViolation, ri_triggers.c:2797
Oh, I know what I'll do (you think), I'll change both inside a transaction:
begin; update subscription set cus_id=2 where cus_id=1;...
ERROR: 23503: update or
delete on table "subscription" violates foreign key constraint
"xxxxxx_id_fkey" on table
"xxxxx"
DETAIL: Key (id)=(1) is still referenced from table "xxxxx".
LOCATION: ri_ReportViolation, ri_triggers.c:2797
Oh, the same :( So even inside a transaction, we can't have inconsistent states.
So.... The trick to let postgres update both columns of the two tables at once is to use a cte. Common Table Expressions have many different uses, and one of them is to bundle multiple queries in a single one. When used with update/inserts it allows these kinds of tricks.
with c as (update customer set id=42 where id=1),
s as (update subscription set cus_id=42 where cus_id=1)
select 1;
As a_horse_with_no_name explains here:
As (non-deferrable) foreign keys are evaluated on statement level and both the primary and foreign key are changed in the same statement, this works.
No hay comentarios:
Publicar un comentario