如何管理联结表上的插入
Posted
技术标签:
【中文标题】如何管理联结表上的插入【英文标题】:How to manage the insert on a junction table 【发布时间】:2021-11-16 09:55:36 【问题描述】:我有两张表:成分表和配方表
recipe table
-----------------------
|recipe_id |name |
-----------------------
|1 |Pasta |
|2 |Pizza |
|3 |Fish |
ingredient table
-------------------------------
|ingredient_id |name |
-------------------------------
|1 |Spaghetti |
|2 |Salmon |
|3 |Tomato sauce|
然后我有这两个表的联结表。
---------------------------
|id|recipe_id|ingredient_id|
---------------------------
|1 |1 |1 |
|2 |2 |3 |
|3 |3 |2 |
我不清楚应该如何在联结表中插入数据。我的意思是,我是否必须通过简单的 INSERT 手动插入 recipe_id
和 ingredient_id
?还是我必须以某种方式使用与其他两个表的关系?
【问题讨论】:
使用简单的 INSERT 手动插入 recipe_id 和 ingredients_id 在单个事务中进行插入。 【参考方案1】:将完整的关系插入到所有三个表中通常需要三个单独的插入语句。您可以通过在单个逻辑事务中执行所有插入来解决此问题。例如:
BEGIN; -- start transaction
INSERT INTO recipe (recipe_id, name) VALUES (1, 'Pasta');
INSERT INTO ingredient (ingredient_id, name) VALUES (1, 'Spagehetti');
INSERT INTO junction_table (recipe_id, ingredient_id) (1, 1);
COMMIT; -- end transaction
实际上,如果recipe_id
和ingredient_id
列是串行/自动递增的,那么您可以在插入语句中省略它们。如果您需要在插入后查找这些表的自动生成的 ID 值,可以使用 pg_get_serial_sequence()
函数 see here。
【讨论】:
【参考方案2】:配方表和配料表是独立的表,可以通过简单的查询插入数据:
insert into recipe (name) values ('Pasta'), ('Pizza '), ('Fish');
insert into ingredient (name) values ('Spaghetti'), ('Salmon '), ('Tomato sauce');
联结表可以通过选择两个表的数据来填充,例如:
insert into recipe_ingredient (recipe_id, ingredient_id)
select recipe_id, ingredient_id
from recipe, ingredient
where recipe.name = 'Pasta' and ingredient.name in ('Spaghetti', 'Tomato sauce');
Try PostgreSQL fiddle
【讨论】:
以上是关于如何管理联结表上的插入的主要内容,如果未能解决你的问题,请参考以下文章