обновить таблицу ссылок - PullRequest
0 голосов
/ 24 мая 2019

Я проверяю следующий подход SQL от сообщества, где я полностью обновляю роли пользователя.(Полное обновление таблицы соединений)

Пользователь

+----+-------+------+
| id | first | last |
+----+-------+------+
|  1 | John  | Doe  |
|  2 | Jane  | Doe  |
+----+-------+------+

Роль

+----+----------+
| id |   name   |
+----+----------+
|  1 | admin    |
|  2 | accounts |
|  3 | sales    |
+----+----------+

UserRole

+--------+--------+
| 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);

Есть ли лучший способ?Я имею в виду сделать это в одном запросе, возможно, для такого рода таблиц связывания / объединения?

Edit

Я думаю, что я должен был сказать, чтобы найти эффективный 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);

1 Ответ

0 голосов
/ 24 мая 2019

Если вы хотите добавить все роли для всех пользователей в таблицу 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...