提问者:小点点

MySql中WARE子句的大容量插入


我有三个数据库表--Roles,Permissions和rolePermissions,如下所示。

Permissions
|---------------------|------------------|
|      name           |        id        |
|---------------------|------------------|
|   THREAD_VIEW       |         1        |
|---------------------|------------------|
|   TEAM_VIEW         |         2        |
|---------------------|------------------|
|   TEAM_EDIT         |         3        |
|---------------------|------------------|

Roles
|---------------------|------------------|
|      name           |        id        |
|---------------------|------------------|
|      ADMIN          |        11        |
|---------------------|------------------|
|      MEMBER         |        12        |
|---------------------|------------------|
|     EMPLOYEE        |        13        |
|---------------------|------------------|
|   FRONT DESK        |        14        |
|---------------------|------------------|
|     GATE KEEPER     |        15        |
|---------------------|------------------|

rolePermissions
|---------------------|------------------|
|      roleId         |    permissionId  |
|---------------------|------------------|
|         11          |         1        |
|---------------------|------------------|
|         11          |         2        |
|---------------------|------------------|
|         12          |         1        |
|---------------------|------------------|
|         12          |         3        |
|---------------------|------------------|
|         13          |         3        |
|---------------------|------------------|
|         14          |         1        |
|---------------------|------------------|
|         15          |         2        |
|---------------------|------------------|

我想编写一个查询,为thread_view(id-1)权限已经处于活动状态的角色添加权限team_view(id-2)。 正如我们在rolepermission表中看到的,roleid11已经具有permissionid2,我必须为roleid12和roleid14添加permissionid2。 我是MySQL的初学者。 我写了一些东西,但那不起作用。

insert into rolePermissions(roleId, permissionId) 
select rp.roleId, p.id from rolePermissions rp
join Permissions p on p.id = rp.permissionId
where p.name = 'THREAD_VIEW' and p.name <> 'TEAM_VIEW';

共1个答案

匿名用户

我想你想:

insert into rolePermissions(roleId, permissionId)
select r.roleId, p.permissionId
from roles r
inner join permissions p on p.name = 'TEAM_VIEW'
where exists (
    select 1 
    from rolePermissions rp1
    inner join permissions p1 on p1.id = r.permissionId
    where p1.name = 'THREAD_VIEW' and rp1.roleId = r.id
)

这将为已经具有'thread_view'权限的角色插入新元组。

如果您希望确保目标表中还不存在新的元组,那么,假设您在roleid,permissionid上有唯一的键,您只需在查询末尾添加一个on duplicate key子句即可:

on duplicate key update roleId = values(roleId)