如何管理联结表上的插入

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_idingredient_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_idingredient_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

【讨论】:

以上是关于如何管理联结表上的插入的主要内容,如果未能解决你的问题,请参考以下文章

管理联结表的最佳方法是啥? (删除并插入)

具有多个表的联结表上的 MySQL SELECT 查询

Fluent nHibernate - 如何在联结表上映射非键列?

使用复合主键在联结表上设置外键约束

用 PHP 操作联结表

而不是所有表上的插入触发器