回答
在SQL Server:
ALTER TABLE [dbo].[PowerOfTwo]
WITH CHECK ADD CONSTRAINT [CK_PowerOfTwo]
CHECK ((log([Value])/log(2)=round(log([Value])/log(2), 0, 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代替任何錯誤容差。
分享和享受。
好的,謝謝! – Andrey 2010-08-11 19:16:17
創建一個列檢查:
CHECK (column_name IN (2, 4, 8, 16, 32, ..., 2147483648))
怎麼樣定義列是N.然後該列的所有用途將是2^N的定義,而不是約束。
否則 - 您可以將觸發邏輯放置在驗證輸入或更新每個值時使用。
我已經想出了幾分鐘之前:)無論如何,我會讓你高興,因爲它是一個好主意 – Andrey 2010-08-11 19:15:18
從this answer無恥偷你可以使用位操作,以漂亮有效做到這一點。
ALTER TABLE tablename ADD CONSTRAINT
ckname CHECK (colName > 0 AND (colName & (colName - 1) =0))
但不如蘭迪的答案效率... ... – 2010-08-11 19:28:51
- 1. SQL Server - 約束
- 2. SQL Server約束
- 3. SQL Server約束跨表
- 4. SQL Server TOP約束
- 5. 涉及不同表上的列的SQL Server 2000約束
- 6. 如何設置唯一約束在SQL Server 2008
- 7. SQL Server列約束和依賴關係
- 8. 如何在兩列SQL Server上應用唯一約束?
- 9. 在許多列上刪除SQL Server中的默認約束
- 10. SQL Server 2008-獲取表約束條件
- 11. SQL Server的正則表達式約束
- 12. 在sql server中的列級別與表級約束? a。
- 13. SQL Server的約束幫助
- 14. Sql Server 2008檢查約束
- 15. SQL Server:檢查約束
- 16. SQL Server 2008中 - 加約束
- 17. SQL Server值<>約束
- 18. SQL Server字符串約束
- 19. SQL Server 2012約束條件
- 20. SQL Server的日期約束
- 21. SQL Server的檢查約束
- 22. 在空表上拋出UNIQUE約束異常INSERT [sql-server]
- 23. SQL Server在新列上設置ANSI_PADDING
- 24. 在6個按鈕上設置約束。
- 25. 如何更正SQL Server語法錯誤設置FK約束?
- 26. 列約束Sql 2008
- 27. 添加CHECK約束在SQL Server:添加約束VS添加復
- 28. SQL Server 2008中單個列上的多個外鍵約束
- 29. 獲取SQL Server 2000上列默認約束的名稱?
- 30. 代表SQL約束
你能給出一個理由,爲什麼你這樣做? – JonH 2010-08-11 19:01:26
好的,它只是我想我應該存儲n比2電源n :)案例解決! – Andrey 2010-08-11 19:11:54