我需要在sqlite3数据库中表达路径数据。我有图表,我需要保存一些顶点之间的最短路径。现在,由于我的图是双向的,A和B之间的最短路径将与B和A之间的路径相同。
我当前的数据库结构看起来像这样:
create table shortest (
id1 long,
id2 long,
...
);
现在,我如何表达(id1, id2)
必须唯一的约束,无论订单?因此,如果我尝试插入insert into shortest values (2, 1, ...)
并且已经存在(1, 2, ...)
的记录,那么插入会失败吗?
我无法弄明白:/
注意:如果需要,可以更改数据库结构,这是一个新项目。
答案 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)
);