关于检查约束的空值

时间:2019-12-18 19:03:40

标签: sql postgresql check-constraints

CREATE TABLE A (
   one INT CHECK (one > 0),
   two INT CHECK (two > 0),
   three INT CHECK (three > 0),
   four INT CONSTRAINT ok CHECK (
   four < one + two + three),
   PRIMARY KEY (one, two)
);

我有下表。字段one, two, three必须为正,字段four必须小于每个字段的总和。

为什么我插入insert into A values (1, 2, 3, null);时查询不会失败?

null < 1 + 2 + 3没有意义,但仍然可以输入吗?

1 个答案:

答案 0 :(得分:1)

NULL的行为不像您想象的那样。用“未知值”替换您头脑中的NULL。

“未知值是否小于1 + 2 + 3?”

就其本身而言,这种说法是荒谬的。从逻辑上讲,答案必须是“答案未知”。是的。

NULL < 1 + 2 + 3不正确。不是错从字面上看是“未知价值”。它为NULL。 NULL上的CHECK语句会失败,因为它们仅在已知的错误值上失败。如果您不希望NULL破坏聚会,请确保永远不要输入NULL。

CREATE TABLE A (
   one INT NOT NULL CHECK (one > 0),
   two INT NOT NULL CHECK (two > 0),
   three INT NOT NULL CHECK (three > 0),
   four INT NOT NULL CONSTRAINT ok CHECK (four < one + two + three),
   PRIMARY KEY (one, two)
);
相关问题