sql - 在 PostgreSQL 中将多对多关系转换为一对多关系

标签 sql postgresql database-design many-to-many one-to-many

我在 foobar 之间有一个多对多模型,它被建模为一个表 foo_barfoo_idbar_id

我现在想将其建模为一对多(我的数据允许)。

我已将 foo_id 列添加到 bar,但现在我想迁移我的数据。所以,我想

UPDATE bar SET foo_id = f where id = b;

每个 fb 对来自

SELECT foo_id AS f, bar_id AS b FROM foo_bar;

是否可以在 SQL(特别是 PostgreSQL 9.0)中执行此操作?

我知道当只有一个值时如何在 UPDATE 中执行子选择,但在这种情况下不知道如何执行。

最佳答案

UPDATE bar b
SET    foo_id = fb.foo_id
FROM   foo_bar fb
WHERE  fb.bar_id = b.bar_id;

如果您应该为一个 bar 设置多行(根据您的描述,您不应该这样做),则该行将更新多次,结果是任意的。

这种形式的查询通常比相关子查询执行得更好。

请注意,bar 的主键实际上应该命名为 bar_id - 我在查询中使用该名称。

关于sql - 在 PostgreSQL 中将多对多关系转换为一对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12151761/

相关文章:

SQL 选择两行

sql - 查找连续模式(使用 SQL)

javascript - 如何将 PostgreSQL 时间戳与 moment.js 进行比较并仅在日期基础上指定?

php - MySql 如果记录存在于选择查询中

mysql - 数据库设计: I have a child table which might be used from more than one parent table (one-to-one). 如何设计其模式

sql - case 语句中的 Hive 摘要函数

sql - 检查并更改 SQL 中列的空值或 null 值?

postgresql - 使用 find_or_create_by 解决竞争条件

url 的 postgresql 唯一非连续 id

database - "historical"数据的数据设计与实践