如何在sqlite3中不管顺序检查唯一的值对?

时间:2015-08-02 09:54:05

标签: sqlite

我需要在sqlite3数据库中表达路径数据。我有图表,我需要保存一些顶点之间的最短路径。现在,由于我的图是双向的,A和B之间的最短路径将与B和A之间的路径相同。

我当前的数据库结构看起来像这样:

create table shortest (
    id1 long,
    id2 long,
    ...
);

现在,我如何表达(id1, id2)必须唯一的约束,无论订单?因此,如果我尝试插入insert into shortest values (2, 1, ...)并且已经存在(1, 2, ...)的记录,那么插入会失败吗?

我无法弄明白:/

注意:如果需要,可以更改数据库结构,这是一个新项目。

1 个答案:

答案 0 :(得分:2)

在一般情况下,这可以通过触发器来解决:

CREATE TRIGGER shortest_unique_path
BEFORE INSERT ON shortest
FOR EACH ROW
BEGIN
    SELECT RAISE(ABORT, 'reverse path already exists')
    FROM shortest
    WHERE id1 = NEW.id2
      AND id2 = NEW.id1;
END;

但是,引入一个额外的约束可能更容易,首先必须使用较小的vertx插入路径:

CREATE TABLE shortest (
    id1 LONG,
    id2 LONG,
    ...,
    UNIQUE(id1, id2),
    CHECK(id1 < id2)
);