Postgresql:为select返回的每一行插入值

时间:2018-02-21 18:04:36

标签: 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');

所以基本上是一些上下文,有一个名为manage_admins的权限允许用户编辑/创建,但现在我需要将此权限分成两个不同的权限。问题是我还有一个role_permissions表,我存储了角色的所有权限。

因此,我需要为具有旧权限的每个角色插入2个新权限,我提供的示例失败,因为SELECT查询返回多个值。所以这就是我遇到的麻烦,所以任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:2)

摆脱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的行,然后select将这些ID与新权限名称一起插入表中。

答案 1 :(得分:1)

要插入多行,只需省略VALUES

INSERT INTO role_permissions (...)
SELECT ...
相关问题