【问题标题】:SQLite Multi-column Insert/Replace with Multiple JoinSQLite 多列插入/替换多连接
【发布时间】:2012-11-25 23:18:48
【问题描述】:

抱歉标题不好。我有一个查询(如下)可以正确执行并按照我的意愿创建插入。但是,我想通过仅在三列的精确组合时插入来使其更智能。本质上,三列元组是一个主键,但我正在处理 sqlite 的单个主键的限制。

基本上下文 我有 4 个表:权限、角色、用户、操作 权限将角色和用户连接到操作。 Actions 表包含用户或具有角色的用户可以执行的可用任务列表。例如,如果 user_id = 1 可以执行 list_folder 操作 (action_id = 1),则权限表将有一个条目:(id=1, action_id=1, user_id=1, role_id=NULL)。同样,假设 owner_role (role_id=1) 可能具有执行 list_folder 操作 (action_id=1) 的权限,则权限条目可能是:(id=2, action_id=1, user_id=NULL, role_id=1)。

当我进行插入时,我想确保我还没有那个确切的组合(例如 action_id=1、user_id=NULL、role_id=1)。而且我不完全确定如何编写 sql 以便正确设置。

这是我的基本插入语句。我需要提出一个插入和替换语句:

INSERT INTO permissions (
   action_id
   ,role_id
)
SELECT DISTINCT
   a.id as "action_id"
   ,r.id as "role_id"
   FROM tmp_permissions tmp
   LEFT OUTER JOIN actions a
       ON tmp.action_name = a.name
   LEFT OUTER JOIN roles r
       ON tmp.roles_name = r.name
   LEFT OUTER JOIN permissions p
       ON p.role_id

这里有一些创建表的 sql 语句:

CREATE TABLE permissions (
id INTEGER NOT NULL, 
enabled INTEGER, 
action_id INTEGER, 
user_id INTEGER, 
role_id INTEGER, 
PRIMARY KEY (id), 
FOREIGN KEY(user_id) REFERENCES users (id), 
FOREIGN KEY(action_id) REFERENCES actions (id), 
FOREIGN KEY(role_id) REFERENCES roles (id)
);
CREATE TABLE actions (
id INTEGER NOT NULL, 
enabled INTEGER, 
name VARCHAR(50), 
permission_ids INTEGER, 
PRIMARY KEY (id), 
FOREIGN KEY(permission_ids) REFERENCES permissions (id)
);
CREATE TABLE roles (
id INTEGER NOT NULL, 
enabled INTEGER, 
name VARCHAR(50), 
permission_ids INTEGER, 
PRIMARY KEY (id), 
FOREIGN KEY(permission_ids) REFERENCES permissions (id)
);
CREATE TABLE users (
id INTEGER NOT NULL, 
enabled INTEGER, 
name VARCHAR(50), 
permission_ids INTEGER, 
PRIMARY KEY (id), 
FOREIGN KEY(permission_ids) REFERENCES permissions (id)
);

这是一个临时表,我使用它来存储表中的数据: 创建表 tmp_permissions( 角色名称 VARCHAR(50), action_name VARCHAR(50) );

以下是一些数据:

#role|action
admin|setup
admin|debug
admin|login
admin|view_user
manager|view_employee
manager|enroll_employee
manager|login
employee|schedule
employee|login
customer|guest_login
customer|change_credentials
guest|guest_login

提前致谢!

【问题讨论】:

    标签: sqlite select join insert replace


    【解决方案1】:

    给表添加UNIQUE约束:

    CREATE TABLE permissions(
        ... ,
        UNIQUE (action_id, user_id, role_id)
    )
    

    然后您可以使用任何conflict resolution algorithms 来处理重复项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多