代码之家  ›  专栏  ›  技术社区  ›  Andrey

在表上设置列约束(SQL Server)

  •  2
  • Andrey  · 技术社区  · 15 年前

    我有一个列,它应该包含2次幂n:2、4、8、16、32等值之一。我想在表架构级别上强制实现这一点-是否有方法指定这样的列约束?

    谢谢!

    5 回复  |  直到 15 年前
        1
  •  4
  •   kbrimington    15 年前

    在SQLServer中:

    ALTER TABLE [dbo].[PowerOfTwo]
    WITH CHECK ADD  CONSTRAINT [CK_PowerOfTwo] 
    CHECK  ((log([Value])/log(2)=round(log([Value])/log(2), 0, 1)))
    
        2
  •  5
  •   Community Mohan Dere    9 年前

    无耻地从 this answer 您可以使用位操作来非常有效地完成这项工作。

    ALTER TABLE tablename ADD CONSTRAINT
        ckname CHECK (colName > 0 AND (colName & (colName - 1) =0))
    
        3
  •  2
  •   Randy    15 年前

    把这个列定义为n,那么这个列的所有用法都是2^n,而不是约束。

    否则-您可以在输入或更新每个值时,将触发器逻辑放置到位,以对其进行验证。

        4
  •  1
  •   Bob Jarvis - Слава Україні    15 年前

    假设您的列名是N。请尝试

    CHECK(LOG(N)/LOG(2) = TRUNC(LOG(N)/LOG(2)))
    

    其目的是验证值n的二进制对数是否为整数,这意味着n是2的幂。不确定SQL Server是否支持日志和trunc函数-根据需要替换正确的名称。

    编辑:当我重读这篇文章时,我意识到四舍五入可能会导致一个问题(我忘记了浮点的第二条戒律,即:永远不要为了相等而比较浮点值!)好的,怎么样

    CHECK(ABS(LOG(N)/LOG(2) - TRUNC(LOG(N)/LOG(2))) < 0.00001)
    

    或者用0.00001代替任何误差容限。

    分享和享受。

        5
  •  0
  •   GSerg    15 年前

    创建列检查:

    CHECK (column_name IN (2, 4, 8, 16, 32, ..., 2147483648))