【问题标题】:SQL Server : unique default valuesSQL Server:唯一的默认值
【发布时间】:2020-12-23 10:24:03
【问题描述】:

我有一个表,其中有一列 nchar(16) 类型的列自动填充了通过将列的默认值设置为 dbo.randomtext((16))(标量函数)生成的随机字符。表中将有大约 1M 条记录。

我知道获得非唯一值的可能性很低,但是有什么方法可以确保不会发生这种情况并且该列确实是唯一的吗?

如果我将列定义为UNIQUE 并且生成的随机文本不是唯一的会发生什么?

我使用的是 SQL Server 2016 标准版。

【问题讨论】:

    标签: sql-server random unique


    【解决方案1】:

    似乎您真正应该使用的是SEQUENCEIDENTITYuniqueidentity,这听起来像是在“重新发明”轮子。

    至于你问的问题:

    我知道获得非唯一值的可能性很低,但是有什么方法可以确保不会发生这种情况并且该列确实是唯一的吗?

    是的,在列上创建UNIQUE INDEXUNIQUE CONSTRAINT。那么每一行,都必须在该列中具有唯一性。

    如果我将列定义为UNIQUE 并且生成的随机文本不是唯一的会发生什么?

    如果列中已经存在至少一个重复项,则创建INDEX/CONSTRAINT 将失败;在创建INDEX/CONSTRAINT 之前,您需要确保DELETE/UPDATE 有任何重复项。如果是INSERT/UPDATE,它将失败,整个 DML 语句将不会生效(不会插入新行,或者不会更新行)。

    【讨论】:

    • SEQUENCE、IDENTITY 和 uniqueidentity 不能使用,因为它们应该是无法猜测的随机值。这些值是在 INSERT 时创建的,我想知道是否有办法告诉 MSSQL 自动避免失败并在存在重复时生成新值。
    • uniqueidentity 无法猜测...充其量是可以计算出来的,但是您需要了解有关该实例的大量信息,并知道时间到类似最接近的 1/1000000 秒。
    • 根据 micorsoft 本身的说法,不应将唯一身份用于安全目的。参见例如devblogs.microsoft.com/oldnewthing/20150701-00/?p=45241
    • 这说不要将它们用作密码@user1480192 ...它什么也没说不要使用它们...不要拿一篇文章阅读较长句子的一部分并阅读完全不同的东西......
    • 这个问题与安全有什么关系?
    猜你喜欢
    • 2014-10-24
    • 2014-08-18
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-11
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    相关资源
    最近更新 更多