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

时间:2010-08-11 18:58:03

标签: sql sql-server constraints

我有一个列应该包含2个幂n:2,4,8,16,32等值之一。我想在表模式级别强制执行 - 有没有办法指定这样的列约束?

谢谢!

5 个答案:

答案 0 :(得分:5)

this answer无耻地窃取你可以使用按位操作来非常有效地执行此操作。

ALTER TABLE tablename ADD CONSTRAINT
    ckname CHECK (colName > 0 AND (colName & (colName - 1) =0))

答案 1 :(得分:4)

在SQL Server中:

ALTER TABLE [dbo].[PowerOfTwo]
WITH CHECK ADD  CONSTRAINT [CK_PowerOfTwo] 
CHECK  ((log([Value])/log(2)=round(log([Value])/log(2), 0, 1)))

答案 2 :(得分:2)

如何将列定义为N.那么根据定义而不是约束,该列的所有使用都将是2 ^ n。

否则 - 你可以设置触发逻辑来验证每个值的输入或更新。

答案 3 :(得分:1)

假设您的列名称为N.尝试类似

的内容
CHECK(LOG(N)/LOG(2) = TRUNC(LOG(N)/LOG(2)))

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

编辑:当我重新阅读本文时,我意识到舍入可能会导致问题(我忘记了浮点的第二条诫命,即:你永远不要为了平等而比较浮点值!)。好的,怎么样

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

或替换0.00001的任何误差容差。

分享并享受。

答案 4 :(得分:0)

创建列检查:

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