我试图理解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)的总和。所有列都是'双精度'。如果我将值从126.3更改为126,它可以工作,我已经测试了其他值(int和double),并且无法理解为什么有时它会起作用,有时候也不会。
我的CHECK约束有什么问题?
PS:对不起我的英语,它不是我的主要语言。
答案 0 :(得分:3)
您决定使用仅包含近似值的浮点数据类型 - 非常精确,但仅限于某种程度。 1.3可能存储为1.299999999999998或类似的东西。因此,91.44和10.22的近似值的总和恰好可能恰好是101.66的近似值,但也可能略有不同。
永远不要将浮点值与等号(=)进行比较。
最好不要首先使用浮选点类型,如果不是真的,真的需要。请改用DECIMAL。