【发布时间】:2022-11-07 01:57:06
【问题描述】:
PostgreSQL:仅当外键存在时如何插入多个值
让我们举一个例子来澄清这个请求:
鉴于:
- 具有多行和属性的表 A:(A_attr1(键),A_attr2)。
- 具有属性的表 B (B_attr1(钥匙) ,A_attr1(外键),B_attr2)。
在表 B 中插入值仅当外键存在时.
【问题讨论】:
标签: postgresql
让我们举一个例子来澄清这个请求:
鉴于:
在表 B 中插入值仅当外键存在时.
【问题讨论】:
标签: postgresql
首先,我们需要考虑一个事实,即(健康)状况(表A中存在外键)是根本,事实上,如果我们尝试在 Table_B 中添加值A_attr1如果它在 Table_A 中不存在,我们会收到这种类型的错误:
ERROR: the INSERT or the UPDATE on the TABLE table_B violates the foreign key constraint
"_A_attr1_"
DETAIL: the key (A_attr1)=(wrong_value) it's not present in the table "Table_A"
这是一个可能的解决方案:
INSERT INTO Table_B(B_attr1, A_attr1, B_attr2)
SELECT x.*
FROM (VALUES
(something,something_else, something_else2),
(something_else3,something_else4, something_else5),
...
(something_else20, something_else21,something_else22)
) x(B_attr1, A_attr1, B_attr2)
WHERE EXISTS(
SELECT FROM TABLE_A y
WHERE (y.A_attr1)=(x.A_attr1)
FOR SHARE);
结果是在 B 中添加所有可接受的元组(即具有现有外键的那个)。
这篇文章是以下问题的扩展: PostgreSQL insert if foreign key exists
该解决方案基于这篇文章中的 cmets:
【讨论】: