这段代码出了什么问题?跨表复制数据的问题

时间:2011-04-14 23:09:21

标签: sql sql-server

insert into Permission (UserID, perm, Login) select UserID, 0, Login from Users

会发生什么:跨表复制数据并插入0作为'perm'列的默认值。但是,每次软件创建表单时,我都需要运行此代码。所以它不断添加它已有的一切。

解决方法:DELETE FROM Permission WHERE perm = 0 - 在运行插入代码之前。这将确保不删除Perm = 1的用户(允许更改内容的用户)。

问题:所以我在运行插入之前运行上面的删除代码。但由于它是一个频繁的例程,它将加倍已经包含在表Permissions中的用户(即:用户Admin将perm = 0,perm = 1)。无论如何都要检测用户是否已经存在并跳过它或什么东西?

3 个答案:

答案 0 :(得分:1)

你能做的是

insert into Permission(UserID,perm,Login)
select UserID, 0, Login
from Users
where UserID NOT IN(select UserID from Permission);

基本上,如果它们不在那里,它会插入它们。

答案 1 :(得分:1)

这只会通过UserID和Login的组合插入不在Permission表中的记录。如果将Login存储为冗余(非规范化数据),则单独使用UserID就足够了。

insert into Permission (UserID, perm, Login)
select U.UserID, 0, U.Login
from Users U
left join Permission P on P.UserID = U.UserID and P.Login = U.Login
where P.Login is null

权限矩阵通常以两种方式之一表示:

  1. 位掩码 - 但这会快速进入可伸缩性问题,因此您的Perm字段包含所有“允许”位的掩码
  2. UserId - PermissionId - 访问(位)。这就是我假设你的表(元组UserId / PermissionId),因此在两个字段上的LEFT JOIN表单。

答案 2 :(得分:1)

当然,这将只插入没有许可记录的记录。

INSERT INTO Permission (UserID, perm, Login) 
SELECT u.UserID, 0, u.Login 
FROM Users u
    LEFT OUTER JOIN Permission p ON u.UserID = p.UserID
WHERE p.UserID IS NULL