SUM 在双精度列上失败的 CHECK 约束
CHECK Constraint for SUM failing on double precision column
我试图了解 SQL Server 2008 R2 中的 CHECK 约束失败(同样的问题发生在 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
列 qty_total 必须包含(qty_type1 和 qty_type2)的总和。所有列都是 'Double precision'。如果我将值从 126.3 更改为 126,它会起作用,我已经测试了其他值(int 和 double),但不明白为什么有时它起作用而有时不起作用。
我的 CHECK 约束有什么问题?
PS:对不起我的英语,它不是我的主要语言。
您决定使用仅包含近似值的浮点数据类型 - 非常精确,但仅限于一定程度。 1.3 很可能存储为 1.299999999999998 或类似的东西。因此,91.44 和 10.22 的近似值之和可能正好是 101.66 的近似值,但也可能略有不同。
切勿将浮点值与等号 (=) 进行比较。
最好一开始就不要使用浮点类型,如果不是真的需要的话。请改用 DECIMAL。
我试图了解 SQL Server 2008 R2 中的 CHECK 约束失败(同样的问题发生在 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
列 qty_total 必须包含(qty_type1 和 qty_type2)的总和。所有列都是 'Double precision'。如果我将值从 126.3 更改为 126,它会起作用,我已经测试了其他值(int 和 double),但不明白为什么有时它起作用而有时不起作用。
我的 CHECK 约束有什么问题?
PS:对不起我的英语,它不是我的主要语言。
您决定使用仅包含近似值的浮点数据类型 - 非常精确,但仅限于一定程度。 1.3 很可能存储为 1.299999999999998 或类似的东西。因此,91.44 和 10.22 的近似值之和可能正好是 101.66 的近似值,但也可能略有不同。
切勿将浮点值与等号 (=) 进行比较。
最好一开始就不要使用浮点类型,如果不是真的需要的话。请改用 DECIMAL。