mysql - 更新链接表
问题描述
我正在验证社区中的 SQL 方法,我正在完全更新用户的角色。(连接表的完整更新)
用户
+----+-------+------+
| id | first | last |
+----+-------+------+
| 1 | John | Doe |
| 2 | Jane | Doe |
+----+-------+------+
角色
+----+----------+
| id | name |
+----+----------+
| 1 | admin |
| 2 | accounts |
| 3 | sales |
+----+----------+
用户角色
+--------+--------+
| userid | roleid |
+--------+--------+
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 2 |
| 2 | 3 |
+--------+--------+
我的 SQL 方法 -> 首先删除所有,然后插入所有记录
DELETE FROM UserRole WHERE userid = 1;
INSERT INTO UserRole(userid, roleid) VALUES(1, 2), (1, 3);
有没有更好的办法?我的意思是可能在单个查询中为这些类型的链接/连接表执行此操作?
编辑
我想我应该说的是找到一个高效的 SQL 操作而不是单个查询。
这是另一个 SQL
DELETE FROM UserRole WHERE user_id = 1 AND role_id NOT IN (2, 3);
INSERT INTO UserRole(user_id, role_id) VALUES(1, 2), (1, 3)
ON DUPLICATE KEY UPDATE user_id = VALUES(user_id), role_id = VALUES(role_id);
解决方案
如果要将所有用户的所有角色添加到 userRoles 表中,可以从 userRoles 中删除,然后重新创建表,如下所示:
DECLARE @users TABLE ( userID INT, UserName NVARCHAR(MAX) )
DECLARE @roles TABLE ( roleID INT, RoleName NVARCHAR(MAX) )
DECLARE @userRoles TABLE ( userID INT, roleID INT )
INSERT INTO @users (userID,UserName) VALUES (1,'name1'),(2,'name2'),(3,'name3')
INSERT INTO @roles (roleID,RoleName) VALUES (1,'admin'),(2,'accounts'),(3,'sales')
INSERT INTO @userRoles (userID,roleID)
SELECT U.userID,R.roleID FROM @users U
FULL OUTER JOIN @roles R ON 1=1
ORDER BY userID
SELECT * FROM @userRoles
输出:
userID roleID
1 1
2 1
3 1
1 2
2 2
3 2
1 3
2 3
3 3
推荐阅读
- javascript - 当您选择另一个手风琴打开时如何确保手风琴关闭
- python - 仅在选择所有旋转器时,如何将python文件部分中的screenmanager调用以更改屏幕
- javascript - 有没有办法选择一个容器的 CSSi ID,它是由 JS 从 API 中获取数据生成的
- python - 有人可以帮我解决我的python整数错误吗
- java - 将类实例添加到 JComboBox
- gensim - Gensim Lemmatization Remove Postag b'
- java - 为什么 sum1=sum1+(charnumber[a]*Math.pow(2, b)) 会奇怪地出现?
- r - 如何使用 dplyr 使用以矩阵为参数的函数按组计算摘要
- php - Ajax 调用返回状态码错误:403 Forbidden
- c# - 如何在 .net 核心中对 Workday API 进行身份验证?