【发布时间】:2017-06-04 03:38:45
【问题描述】:
我需要在我的 SQLite3 数据库中进行检查,以确保用户无法输入具有重叠间隔的数据。
例如:
hole # Sample From To
1 1 1 2
1 2 2 3
1 3 2.2 2.9
在上面的示例中,我已经进行了检查,可以在每个孔中捕获任何重复的“From”,但样本 #3 不是重复的,因此不会被捕获,但它是一个重叠间隔。
我不希望将其用于查询,而是将其用作表中内置的数据输入检查。
到目前为止,我已尝试添加('From' NOT BETWEEN 'From' and 'To) 的约束检查,但无济于事。我不明白检查是尝试逐行应用,我想要,还是在主键的基础上。
这是我正在尝试的表定义:
CREATE TABLE assay (
BHID TEXT NOT NULL
CONSTRAINT [Check BHID] REFERENCES collar (BHID) ON DELETE CASCADE
ON UPDATE CASCADE
MATCH SIMPLE,
[Sample #] TEXT UNIQUE,
[FROM] NUMERIC NOT NULL
CONSTRAINT [Interval Check] CHECK ( ("TO" > "FROM") ),
[TO] NUMERIC NOT NULL,
Ag NUMERIC CONSTRAINT [Max Silver] CHECK ( (Ag < 1000) ),
Zn NUMERIC CONSTRAINT [Max Zinc] CHECK ( (Zn < 50) ),
Pb NUMERIC CONSTRAINT [Max Lead] CHECK ( (Pb < 50) ),
Fe NUMERIC,
PRIMARY KEY (
BHID,
[FROM]
)
);
这是具有更新约束的表(在提交之前):
CREATE TABLE assay (
BHID TEXT NOT NULL
CONSTRAINT [Check BHID] REFERENCES collar (BHID) ON DELETE CASCADE
ON UPDATE CASCADE
MATCH SIMPLE,
[Sample #] TEXT UNIQUE,
[FROM] NUMERIC NOT NULL
CONSTRAINT [Interval Check] CHECK ( ("TO" > "FROM") )
CONSTRAINT [Not Between] CHECK ( ('From' NOT BETWEEN 'From' AND 'To') ),
[TO] NUMERIC NOT NULL,
Ag NUMERIC CONSTRAINT [Max Silver] CHECK ( (Ag < 1000) ),
Zn NUMERIC CONSTRAINT [Max Zinc] CHECK ( (Zn < 50) ),
Pb NUMERIC CONSTRAINT [Max Lead] CHECK ( (Pb < 50) ),
Fe NUMERIC,
PRIMARY KEY (
BHID,
[FROM]
)
);
我删除了包含冲突数据的数据行(从:2.2,到:2.9)并在尝试添加新的约束检查之前提交了更改。但它不会让我提交新的约束,我相信因为它试图将它应用于整个列。
所以我的问题应该是:有没有办法在 sql 中逐行应用约束检查?
【问题讨论】:
-
你试过什么?你在哪里卡住了?
-
我已经尝试过('From' NOT BETWEEN 'From' and 'To'),但它不起作用,我不确定下一步该做什么。
-
显示实际的表定义,以及您尝试添加的实际约束。
-
对于我对问题的解释质量不佳,我深表歉意。总的来说,我对 sql 和数据库是全新的,我相信你可以说出来。
标签: sqlite sqlitestudio