如何正确插入M..N表?

时间:2019-04-25 10:59:00

标签: sql sqlite

我有一个简单的设置,其中包含3个表:RolePermissionRolePermission

Role:            | Permission:            | RolePermission:
ID    SysName    | ID    SysName          | Role    Permission
--    -------    | --    -------          | ----    ----------
 1    Admin      |  1    DoUserThings     |    1    1
 2    User       |  2    DoAdminThings    |    1    2
                 |  3    HackTheGibson    |    1    3
                                          |    2    1

这个想法是角色和权限分开存在,并且表“ RolePermission”分配了哪些角色具有哪些权限。

在此示例中,管理员具有所有权限,而用户具有DoUserThings权限。

但是,我不确定如何正确编写INSERT语句。我编写了一个同时查询RolePermission表的表,但它似乎并不是最有效的表。我不确定要加入什么。

到目前为止,这是我的尝试:

INSERT INTO RolePermission (Role, Permission)
SELECT Role.ID, Permission.ID
FROM Role, Permission
WHERE
    Role.SysName == 'Admin'
    AND
    Permission.SysName == 'DoUserThings';

这会将1, 2插入RolePermission表中。


注意:我目前正在使用SQLite进行测试,但希望与MySQL和/或PostgreSQL兼容。

1 个答案:

答案 0 :(得分:3)

您的方法很好,尽管我可能倾向于将其表述为:

INSERT INTO RolePermission (Role, Permission)
    SELECT r.ID, p.ID
    FROM Role r JOIN
         Permission p
         ON r.SysName = 'Admin' AND
            p.SysName = 'DoUserThings';

从性能的角度来看,逻辑的表达方式并不重要。如果您关心性能,请在Role(SysName, Id)Permission(SysName, Id)上添加索引。