我有一个艺术展览的SQLite数据库。在“展品”表中,我有关于艺术品ID、展览空间ID、开始日期和结束日期的列。“结束日期”的默认值为空。当然,同一幅艺术品不能同时显示在两个不同的空间中。因此,我希望确保不创建带有艺术品ID的新行,除非所有具有相同艺术品ID的现有行都有一个非空结束日期。是否有某种约束、触发器等可以添加到表中以确保这一点?
发布于 2018-06-17 11:31:21
我不是为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发布于 2018-06-17 11:32:31
根据您的信息,“艺术品”不能在同一展览中显示两次,这意味着当将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、14级、状态1、第4行不能使用唯一索引'testConstrain‘在对象'bginsburg.testConstrain’中插入重复的键行。重复的键值是(1,)。声明已被终止。
https://stackoverflow.com/questions/50896057
复制相似问题