Sql 检查双精度列上的求和失败约束

Sql 检查双精度列上的求和失败约束,sql,sql-server-2008-r2,sql-server-2012,Sql,Sql Server 2008 R2,Sql Server 2012,我试图理解SQL Server 2008 R2中的检查约束失败(同样的问题也发生在SQL Server 2012上) 我的sql命令只是将两列的数量更新126.3,约束检查两列的总和是否与第三列匹配 以下是重现问题的步骤: CREATE TABLE FailedCheck ( item VARCHAR(10), qty_total DOUBLE PRECISION, qty_type1 DOUBLE PRECISION, qty_type2 DOUBLE PRECISION ) ALTER TA

我试图理解SQL Server 2008 R2中的检查约束失败(同样的问题也发生在SQL Server 2012上)

我的sql命令只是将两列的数量更新126.3,约束检查两列的总和是否与第三列匹配

以下是重现问题的步骤:

CREATE TABLE FailedCheck ( item VARCHAR(10), qty_total DOUBLE PRECISION, qty_type1 DOUBLE PRECISION, qty_type2 DOUBLE PRECISION )
ALTER TABLE FailedCheck ADD CONSTRAINT TotalSum CHECK(qty_total = (qty_type1 + qty_type2));
INSERT INTO FailedCheck VALUES ('Item 2', 101.66, 91.44, 10.22);
UPDATE FailedCheck SET qty_total = qty_total + 126.3, qty_type1 = qty_type1 + 126.3
列数量总计必须包含(数量类型1和数量类型2)之和。所有列均为“双精度”。如果我将该值从126.3更改为126,它会工作,我已经测试了其他值(int和double),但无法理解为什么它有时工作,有时不工作

我的支票限制有什么问题


PS:对不起,我的英语不是我的主要语言。

您选择的浮点数据类型只包含一个近似值-非常精确,但仅在一定程度上。1.3很可能存储为1.29999999998或类似的东西。因此,91.44和10.22的近似值之和可能恰好是101.66的近似值,但也可能略有不同

切勿将浮点值与等号(=)进行比较


最好不要在一开始就使用floting point类型,如果不是真的需要的话。请改用十进制。

您选择的浮点数据类型只包含一个近似值-非常精确,但仅在一定范围内。1.3很可能存储为1.29999999998或类似的东西。因此,91.44和10.22的近似值之和可能恰好是101.66的近似值,但也可能略有不同

切勿将浮点值与等号(=)进行比较


最好不要在一开始就使用floting point类型,如果不是真的需要的话。请改用十进制。

您选择的浮点数据类型只包含一个近似值-非常精确,但仅在一定范围内。1.3很可能存储为1.29999999998或类似的东西。因此,91.44和10.22的近似值之和可能恰好是101.66的近似值,但也可能略有不同

切勿将浮点值与等号(=)进行比较


最好不要在一开始就使用floting point类型,如果不是真的需要的话。请改用十进制。

您选择的浮点数据类型只包含一个近似值-非常精确,但仅在一定范围内。1.3很可能存储为1.29999999998或类似的东西。因此,91.44和10.22的近似值之和可能恰好是101.66的近似值,但也可能略有不同

切勿将浮点值与等号(=)进行比较


最好不要在一开始就使用floting point类型,如果不是真的需要的话。改为使用十进制。

为什么
qty\u total
不只是一个计算列(为什么它们
DECIMAL
不具有固定精度,因为)?这就像有多余的数据——一个表单字段是你的生日,另一个字段是你的年龄,然后当它们不匹配时抱怨。由于您总是可以从出生日期计算年龄,因此询问年龄也没有什么意义(更不用说存储和维护了)。嗯,
DOUBLE PRECISION
是一种近似的数据类型,对于这种检查约束,您应该使用精确的数据类型。您还可以看到更多信息。为什么
qty\u total
不只是一个计算列(为什么它们不是具有固定精度的
DECIMAL
?这就像有多余的数据——一个表单字段是你的生日,另一个字段是你的年龄,然后当它们不匹配时抱怨。由于您总是可以从出生日期计算年龄,因此询问年龄也没有什么意义(更不用说存储和维护了)。嗯,
DOUBLE PRECISION
是一种近似的数据类型,对于这种检查约束,您应该使用精确的数据类型。您还可以看到更多信息。为什么
qty\u total
不只是一个计算列(为什么它们不是具有固定精度的
DECIMAL
?这就像有多余的数据——一个表单字段是你的生日,另一个字段是你的年龄,然后当它们不匹配时抱怨。由于您总是可以从出生日期计算年龄,因此询问年龄也没有什么意义(更不用说存储和维护了)。嗯,
DOUBLE PRECISION
是一种近似的数据类型,对于这种检查约束,您应该使用精确的数据类型。您还可以看到更多信息。为什么
qty\u total
不只是一个计算列(为什么它们不是具有固定精度的
DECIMAL
?这就像有多余的数据——一个表单字段是你的生日,另一个字段是你的年龄,然后当它们不匹配时抱怨。由于您总是可以从出生日期计算年龄,因此询问年龄也没有什么意义(更不用说存储和维护年龄)。嗯,
DOUBLE PRECISION
是一种近似的数据类型,对于这种检查约束,您应该使用精确的数据类型。您还可以查看更多信息。是的,如果不需要近似数字数据类型,则不鼓励。如果不需要,则不鼓励近似数字数据类型。如果不需要,则不鼓励近似数字数据类型。如果不需要,则不鼓励近似数字数据类型。