我需要在 sqlite3 数据库中表达路径数据。我有图表,我需要保存一些顶点之间的最短路径。现在,由于我的图是双向的,A 和 B 之间的最短路径将与 B 和 A 之间的路径相同。
我当前的数据库结构如下所示:
create table shortest (
id1 long,
id2 long,
...
);
现在,如何表达 (id1, id2)
必须唯一的约束,无论顺序如何?因此,如果我尝试插入插入最短值 (2, 1, ...)
并且已经存在 (1, 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;
但是,引入一个附加约束(即必须首先插入较小顶点的路径)可能会更容易:
CREATE TABLE shortest (
id1 LONG,
id2 LONG,
...,
UNIQUE(id1, id2),
CHECK(id1 < id2)
);
关于sqlite - 如何在 sqlite3 中表达对唯一值对的检查,无论顺序如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31770677/