sql - 如何插入具有多对多关系的表中
问题描述
â我有三张桌子。权限、角色和引用这两个表的第三个表role_permissions。我想在角色和角色权限表中插入一条记录。
如何才能做到这一点?
权限
+---------------+-----------+
| permission_id | name |
+---------------+-----------+
| 1 | role_edit |
+---------------+-----------+
角色
+---------------+-----------+
| role_id | name |
+---------------+-----------+
| 1 | admin |
+---------------+-----------+
角色权限
+---------------+-----------------+
| role_id | permission_id |
+---------------+-----------------+
| 1 | 1 |
+---------------+-----------------+
解决方案
正如其他人指出的那样,假设适当的主键和外键就位,您必须先创建roles
andpermissions
才能创建 role_permissions。不幸的是,Postgres 没有提供直接的方法来获取表的 LAST ID,而且最后一个角色或权限通常可能是您需要的。您需要对每个名称列设置唯一约束。然后创建 role_permissions 你可以自信地id
从name
你想要组合的地方获得适当的权限。您使用这些名称连接两个表。
insert into role_permissions(role_id, permission_id)
select role_id, permission_id
from roles r
join permissions p
on ( r.name = 'group1'
and p.name = 'read all'
);
您还可以创建一个过程来处理整个过程: insert roles
, insertpermissions
和 insertrole_permissions
只给出您想要组合的名称。
create or replace
procedure build_role_permissions( role_name_in text
, permission_name_in text
)
language sql
as $$
insert into roles(name)
values(role_name_in)
on conflict (name)
do nothing;
insert into permissions(name)
values(permission_name_in)
on conflict (name)
do nothing;
insert into role_permissions(role_id, permission_id)
select role_id, permission_id
from roles r
join permissions p
on ( r.name = role_name_in
and p.name = permission_name_in
)
on conflict (role_id, permission_id)
do nothing;
$$;
见演示。
推荐阅读
- java - 如何从房间数据库中获取字符串
- javascript - 使用条件渲染时,如何在加载页面时渲染元素?
- gentics-mesh - 如何在模式属性中检索完整节点:节点
- android - 如何使用来自用户的输入动态制作片段(用户输入 = 片段数)
- sql - 在 INSERT 语句中使用 OUTPUT INTO 和 from_table_name
- ethereum - 使用 bytes4 参数调用合约函数会出错
- android - 在 Android AOSP 上使用 QMI 接口调制解调器设置数据连接
- android - tesseract 训练数据(tessdata_best 版本)文件在 Android 设备上不起作用
- ios - 如何在 MVVM-C RxSwift 中实现 firebase 身份验证
- java - Firebase节点为空时删除Android投票应用程序节点