gpt4 book ai didi

mysql - 更新链接表

转载 作者:行者123 更新时间:2023-11-29 15:59:30 25 4
gpt4 key购买 nike

我正在验证社区中的以下 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 |
+--------+--------+

My 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

关于mysql - 更新链接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56295880/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com