我有一个列应该包含2个幂n:2,4,8,16,32等值之一。我想在表模式级别强制执行 - 有没有办法指定这样的列约束?
谢谢!
答案 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))