PostgreSQL:为每个由SELECT返回的行插入值

11

您好,我在尝试构建以下查询时遇到了问题:

INSERT INTO role_permissions (role_id, permission)
VALUES (
   (SELECT role_id
    FROM role_permissions
    WHERE permission = 'manage_admins'),
   'create_admins');

INSERT INTO role_permissions (role_id, permission)
VALUES (
   (SELECT role_id
    FROM role_permissions
    WHERE permission = 'manage_admins'),
   'edit_admins');

基本上,这里需要一些背景知识。有一个叫做manage_admins的权限可以让用户进行编辑/创建操作,但现在我需要将该权限分成两个不同的权限。问题是,我还有一张role_permissions表格,其中存储了角色的所有权限。
因此,我需要为每个拥有旧权限的角色插入两个新权限。提供的示例失败了,因为SELECT查询返回了多个值。这就是我遇到的困难,所以非常感谢任何帮助。
2个回答

15

摆脱values

INSERT INTO role_permissions (role_id, permission)
SELECT rp.role_id, t.permission
FROM role_permissions rp
  cross join (values ('edit_admins'), ('create_admins')) as t(permission)
WHERE rp.permission = 'manage_admins';

交叉连接将创建两个带有相同 role_id 的行,然后选择将这些 ID 与新的权限名称一起插入表中。

你知道如何在交叉连接的值中创建新的选择查询吗? - Rabhi salim

3
为了插入多行,只需要省略 VALUES:
INSERT INTO role_permissions (...)
SELECT ...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接