SQLite能否设置小数位数约束?单小数位限制实现方案
解答
不需要为了这个需求迁移到MySQL,SQLite本身就支持通过约束实现小数位数限制,你找到的方案是完全可行的。
SQLite采用动态类型系统,声明的字段类型仅代表类型亲和性,不会对写入的数值做强制约束,所以你之前尝试的DECIMAL(n,1)写法无法实现限制效果,这是SQLite的原生设计特性,并非操作错误。
你使用的CHECK约束逻辑CHECK(字段名 = ROUND(字段名,1)),本质是要求写入的数值与保留1位小数后的计算结果完全相等,天然过滤了小数位数超过1位的非法值,方案轻量高效,完全可以满足毫米计量值的存储需求。
具体实现示例
- 建表语句:
CREATE TABLE demo( a REAL CHECK(a = ROUND(a,1)), b REAL CHECK(b = ROUND(b,1)), c REAL GENERATED ALWAYS AS (a+b) )
- 写入合法数据测试:执行
INSERT INTO demo (a,b) values (41.4,22.6)可正常插入 - 写入非法数据测试:执行
INSERT INTO demo (a,b) values (1.45,22.68)会触发约束报错,报错信息如下:
Execution finished with errors. Result: CHECK constraint failed: a = ROUND(a,1) At line 1: insert into demo (a,b) values (1.45,22.68)
内容的提问来源于stack exchange,提问作者Etsaf
相关产品推荐
相关产品推荐

