我有一个艺术展览的SQLite数据库。在“展览”表格中,我有艺术品ID,展览空间ID,开始日期和结束日期的列。 “结束日期”的默认值为NULL。 当然,同一艺术品不能同时在两个不同的空间展示。所以我想确保不创建具有图稿ID的新行,除非具有相同图稿ID的所有现有行都具有非null结束日期。 是否有某种约束,触发器等可以添加到表中以确保这一点?
答案 0 :(得分:0)
我不是为SQLite编写触发器的专家,但是这样的事情应该可行,
CREATE TRIGGER check_open_ended_exhibit BEFORE INSERT ON exhibits
BEGIN
SELECT RAISE(ABORT, "Open ended exhibit exists")
WHERE EXISTS(SELECT * FROM exhibits WHERE artworkID = NEW.artworkID AND enddate IS NULL);
END
答案 1 :(得分:-1)
根据您的信息,“Artwork”无法在同一个节目中显示两次,这意味着EndTime在与艺术品一起约束时是一个独特的字段。因此,通过将这两者结合在一起,如果已经有“艺术品和空白”,则无法插入记录。
所以,你可以在这两列上创建一个独特的约束。
CREATE TABLE testConstrain (
id INTEGER NOT NULL,
endDate DATETIME
)
CREATE UNIQUE INDEX testConstrain
ON testConstrain(id, endDate);
INSERT INTO testConstrain VALUES('1',null)
INSERT INTO testConstrain VALUES('2','01-01-2018')
INSERT INTO testConstrain VALUES('1','01-01-2018')
INSERT INTO testConstrain VALUES('1',null)
`
你会得到: 开始在第11行执行查询 (1排受影响) (1排受影响) (1排受影响) Msg 2601,Level 14,State 1,Line 4 无法在对象' bginsburg.testConstrain'中插入重复键行具有唯一索引' testConstrain'。重复键值为(1,)。 该语句已终止。