检查约束似乎是自动舍入

时间:2018-03-21 03:56:22

标签: sql oracle constraints rounding

我对Oracle比较陌生,似乎做了些蠢事。我试图添加一个约束,如果我的值TestLengthHours大于6,尝试插入新行应该会导致错误。

我有一些困难向Google解释这是什么,并希望你好人可以帮我告诉我这个愚蠢的错误。

我几乎可以肯定这与舍入有关。如果我使TestLengthHours 6.5或更高版本,插入失败,因为它是预期的。如果TestLengthHours小于6.5,则不会。

在我的例子中,我改变了表TESTTABLE来添加约束。我确保TestLengthHours< = 6.0且TestLengthHours不为空。

然后我尝试插入一个应该失败的值,因为它的TestLengthHours值为6.1,大于6,因此应该违反约束。不幸的是,我做错了什么,行正在成功创建。

-- Constraint for TESTTABLE to make sure TestLengthHours is less than or equal to 6
ALTER TABLE TESTTABLE ADD CONSTRAINT valueTuest
    CHECK (TestLengthHours <= 6.0
    AND TestLengthHours IS NOT NULL);
-- The following insert should fail, but does not, even though 6.1 is more than or equal to 6.0
INSERT INTO TESTTABLE (ID, TestNumber, TestName, TestDescription, TestLengthHours, TestStatus)
VALUES (16, 'SES-2216', 'Cool Name', 'Cool Description', 6.1, 'B');

-- The following /does/ fail. If TestLengthHours is 6.5 or higher, it fails as it should.
INSERT INTO TESTTABLE (ID, TestNumber, TestName, TestDescription, TestLengthHours, TestStatus)
VALUES (17, 'SES-2218', 'Cool Name', 'Cool Description', 6.5, 'B');

现在,我可以将TestLengthHours四舍五入到最接近的整数,但我认为这不是解决这个问题的正确方法。

我尝试过的另一件事就是像Java一样做了CHECK(TestLengthHours&lt; = 6.0D),但是我也尝试了这个尝试。

TestLengthHours的数据类型是TestLengthHours NUMBER(4)

1 个答案:

答案 0 :(得分:0)

如果要为TESTTABLE列创建TestLengthHours number not null TestLengthHours,则添加CHECK (TestLengthHours <= 6 )约束就足够了。因为&#39; 6.1&#39;或者&#39; 6.5&#39;是字符串值,而6.1和6.5是数字

在您的情况下,似乎数据类型为integer,并且四舍五入(将使用number数据类型而不是integer)。