抱歉标题不好。我有一个查询(如下)可以正确执行并按照我的意愿创建插入。但是,我想通过仅在三列的精确组合时插入来使其更智能。本质上,三列元组是一个主键,但我正在处理 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)
);
这是我在使用它时用来将数据存储在表中的临时表:CREATE TABLE tmp_permissions(roles_name 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
提前致谢!