PostgreSQL:为选择返回的每一行插入值

Tuc*_*uco 0 sql postgresql

嗨,我在尝试弄清楚如何构建以下查询时遇到了麻烦:

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');
Run Code Online (Sandbox Code Playgroud)

因此,基本上在某些情况下,有一个称为的权限manage_admins,该权限将允许用户编辑/创建,但是现在我需要将此权限分为2个不同的权限。关键是我还有一个role_permissions表,用于存储角色的所有权限。

因此,我需要为每个具有旧权限的角色插入2个新权限,我提供的示例失败了,因为SELECT查询返回了多个值。所以这就是我遇到的麻烦,因此我们将不胜感激。

a_h*_*ame 5

摆脱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';
Run Code Online (Sandbox Code Playgroud)

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