我正在编写会员提供商,以便与我们现有的会员基础一起使用。我使用EF4.1进行所有数据库访问,其中一个我遇到的是当最初设置数据库时,关系是以编程方式而不是数据库中完成的。如果需要在我们所有用户不需要的列上建立关系,但是为了使关系确实是唯一的(根据我的理解)。
我认为我的解决方案是在userid字段上执行MD5哈希(这是唯一的......这将保证该字段中的唯一值)。我在sql服务器上遇到问题的部分是执行此操作的查询,不会替换存储在employeeNum字段中的现有值(有问题的那个)。
简而言之,我的问题是。在employeeNum
字段中获取唯一值的最佳方法是什么(可能基于userid
字段的md5哈希值)在尚未存在值的所有行上。此外,对于次要/主要程度......这听起来像一个好的计划吗?
答案 0 :(得分:10)
如果您的问题只是如何为userid生成哈希值,则可以使用计算列(或者在插入过程中生成此值)来执行此操作。在您说“最佳”时,我不清楚您是否了解HASHBYTES功能或您正在查看的其他标准。
DECLARE @foo TABLE
(
userid INT,
hash1 AS HASHBYTES('MD5', CONVERT(VARCHAR(12), userid)),
hash2 AS HASHBYTES('SHA1', CONVERT(VARCHAR(12), userid))
);
INSERT @foo(userid) SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 500;
SELECT userid, hash1, hash2 FROM @foo;
结果:
userid hash1 hash2
------ ---------------------------------- ------------------------------------------
1 0xC4CA4238A0B923820DCC509A6F75849B 0x356A192B7913B04C54574D18C28D46E6395428AB
2 0xC81E728D9D4C2F636F067F89CC14862C 0xDA4B9237BACCCDF19C0760CAB7AEC4A8359010B0
500 0xCEE631121C2EC9232F3A2F028AD5C89B 0xF83A383C0FA81F295D057F8F5ED0BA4610947817
在SQL Server 2012中,我强烈建议至少使用SHA2_256而不是上述任何一种。 (你忘了提到你正在使用的版本 - 总是有用的信息。)
所有这一切,我仍然想提请注意我在评论中提出的观点:这里的“最佳”解决方案是修复模型。如果employeeNum
是可选的,则不应使EF认为它是必需的或唯一的,并且如果它实际上不是某种标识符,则不应在关系中使用它。如果您首先在关系中使用正确的属性,为什么用户会关心employeeNum
和userid
之间的冲突?
编辑
那么说UPDATE table SET EmployeeNum = 1000000 + UserID WHERE EmployeeNum IS NULL
有什么问题?如果EmployeeNum
将保持低于1000000
,那么您可以保证不会发生冲突,并且您完全避免了散列。
如果employeeNum
可能包含字符串,您可以生成类似的填充,但同样是EF会促使这些可怕的列名称?为什么带有Num
后缀的列包含除数字之外的任何内容?
答案 1 :(得分:2)
您还可以使用 uniqueidentifier 将默认值设置为(newid())
创建一个新列EmployeeNum作为唯一身份,然后:
UPDATE Employees SET EmployeeNum = newid()
然后设置为主键。
答案 2 :(得分:1)
UPDATE EMPLOYEE
SET EMPLOYEENUM = HASHBYTES('SHA1', CAST(USERID AS VARCHAR(20)))
WHERE EMPLOYEENUM IS NULL