SQLite检查重复行

时间:2018-06-17 11:08:59

标签: sqlite

我有一个艺术展览的SQLite数据库。在“展览”表格中,我有艺术品ID,展览空间ID,开始日期和结束日期的列。 “结束日期”的默认值为NULL。 当然,同一艺术品不能同时在两个不同的空间展示。所以我想确保不创建具有图稿ID的新行,除非具有相同图稿ID的所有现有行都具有非null结束日期。 是否有某种约束,触发器等可以添加到表中以确保这一点?

2 个答案:

答案 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,)。 该语句已终止。