我正在尝试在 SQLite 中合并一个检查约束,其中要求如下:
- 该值可能为空
- 如果该值不为空,那么它应该大于 3。
所以,在我的创建表中我写了
create table T(A real check(A = null or A>3));
为此,它看起来像是创建了表,但它不强制执行大于条件。
我也试过
create table T(A real check(A is null or A>3));
这甚至不会首先创建表。
有人可以帮助如何执行这两个约束吗?
谢谢
我正在尝试在 SQLite 中合并一个检查约束,其中要求如下:
所以,在我的创建表中我写了
create table T(A real check(A = null or A>3));
为此,它看起来像是创建了表,但它不强制执行大于条件。
我也试过
create table T(A real check(A is null or A>3));
这甚至不会首先创建表。
有人可以帮助如何执行这两个约束吗?
谢谢
从 SQL-92 标准:
当且仅当指定的搜索条件对于表的任何行都不为假时,才满足表检查约束。
如果A
为空,则 A > 3
由于 SQL 的三值逻辑,计算结果为 UNKNOWN。因为 UNKNOWN 不是 FALSE,所以将满足约束。
考虑一下,如果标准不是这样编写的,那么每个约束都必须明确地测试 null,这对编码人员来说将是更多的“噪音”和痛苦。
为什么两者都需要?只需允许该字段为 NULL 并使条件 A>3。该字段将是 NULL 或者如果不是 NULL,则大于 3...
CREATE TABLE (A real NULL check(A>3))