如何解决用串行主键更新一个表,用引用外键更新另一个表postgres
我有两个具有主键/外键关系的表
主键表:
create table table_one (
table_one_id_field serial,field1 varchar (100) not null,field2 varchar (100) not null,constraint pk__table_one primary key (table_one_id_field)
);
create unique index ix_table_one one table_one (field1,field2)
外键表
create table table_two (
table_two_id int not null,table_one_id_field int not null,-- the foreign key
field a int,field b int,constraint pk_table_two primary key (table_two_id)
constraint fk_table_two foreign key (table_one_id_field) references table_one (table_one_id_field)
);
我不确定更新这两个表的最佳方法是什么。我首先想到的是做这样的事情:
insert into table_one
(field1,field2)
values
('val1','val2')
on conflict (field1,field2) do nothing
returning table_one_id_field
,然后使用返回的值更新table_two。但是,如果确实存在冲突,则不会返回该ID。我的第二个想法是在没有返回语句的情况下运行相同的查询,然后运行选择查询
insert into table_one
(field1,field2) do nothing;
select table_one_id_field from table_one where field1 = 'val1' and field2 = 'val2'
但是我不确定这是否是最安全的方法。还有另一种最佳实践方法可以实现这一目标吗?
解决方法
returning
无法为您提供未插入行的ID,因此在插入后再次选择似乎是相关方法。您可以使用通用表表达式同时执行这两项操作:
with
params as (values('val1','val2')) v(field1,field2),ins as (
insert into table_one (field1,field2)
select * from params
on conflict (field1,field2) do nothing
)
select t.table_one_id_field
from table_one t
inner join params p
on p.field1 = t.field1 and p.field2 = t.field2
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。