SQLite 中可以使用十进制数约束吗?
Is decimal number constraint possible in SQLite?
问题
我正在使用 SQLite,我有一堆字段表示以毫米为单位的度量值,我想将它们限制为小数点后的 1 个数字(例如 1.2
;12.2
; 122.2
等等)。
我见过这样的事情,例如将 DECIMAL(n,1)
作为类型,我试过了,但它似乎没有限制值(我想这是因为它不是一个实际的 SQLite 类型)。
我需要迁移到 MySQL 才能正常工作吗?
编辑(找到解决方案)
我使用了 Dan04 的答案:它很简单而且效果很好:
► Table如下:
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)
您可以使用 the ROUND
function 进行 CHECK
约束。将列声明为:
mm REAL CHECK(mm = ROUND(mm, 1))
但请注意,底层表示仍然是二进制浮点数,通常需要注意准确性。
MySQL的DECIMAL(nn,1)
会四舍五入到小数点后1位用于存储。这与约束不同。
当显示数据时,您的应用应将结果四舍五入到有意义的精度。 (对于天气读数来说,小数点后一位可以说是过分了。)
一般来说,测量值(不是钱)应该存储在 FLOAT
中。此数据类型(在 MySQL 和许多其他产品中)提供 7 个“有效数字”和相当大的值范围。
FLOAT
用于经纬度时精度足以区分两辆车,但精度不足以区分两个人拥抱。
(抱歉,我不能代表 SQLite。如果 FLOAT
可用,那么我建议您使用它并在 output 上四舍五入。)
问题
我正在使用 SQLite,我有一堆字段表示以毫米为单位的度量值,我想将它们限制为小数点后的 1 个数字(例如 1.2
;12.2
; 122.2
等等)。
我见过这样的事情,例如将 DECIMAL(n,1)
作为类型,我试过了,但它似乎没有限制值(我想这是因为它不是一个实际的 SQLite 类型)。
我需要迁移到 MySQL 才能正常工作吗?
编辑(找到解决方案)
我使用了 Dan04 的答案:它很简单而且效果很好:
► Table如下:
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)
您可以使用 the ROUND
function 进行 CHECK
约束。将列声明为:
mm REAL CHECK(mm = ROUND(mm, 1))
但请注意,底层表示仍然是二进制浮点数,通常需要注意准确性。
MySQL的DECIMAL(nn,1)
会四舍五入到小数点后1位用于存储。这与约束不同。
当显示数据时,您的应用应将结果四舍五入到有意义的精度。 (对于天气读数来说,小数点后一位可以说是过分了。)
一般来说,测量值(不是钱)应该存储在 FLOAT
中。此数据类型(在 MySQL 和许多其他产品中)提供 7 个“有效数字”和相当大的值范围。
FLOAT
用于经纬度时精度足以区分两辆车,但精度不足以区分两个人拥抱。
(抱歉,我不能代表 SQLite。如果 FLOAT
可用,那么我建议您使用它并在 output 上四舍五入。)