在sqlite3中,无论顺序如何,如何表示对唯一值对的检查?
我需要在sqlite3数据库中表达路径数据。我有图形,我需要保存一些顶点之间的最短路径。现在,因为我的图是双向的,所以A和B之间的最短路径将与B和A之间的路径相同 我当前的数据库结构如下所示:在sqlite3中,无论顺序如何,如何表示对唯一值对的检查?,sqlite,Sqlite,我需要在sqlite3数据库中表达路径数据。我有图形,我需要保存一些顶点之间的最短路径。现在,因为我的图是双向的,所以A和B之间的最短路径将与B和A之间的路径相同 我当前的数据库结构如下所示: create table shortest ( id1 long, id2 long, ... ); 现在,我如何表达约束,即无论顺序如何,(id1,id2)必须是唯一的?因此,如果我尝试将插入到最短值(2,1,…)中,并且已经存在(1,2,…)的记录,插入会失败吗 我无法理解这
create table shortest (
id1 long,
id2 long,
...
);
现在,我如何表达约束,即无论顺序如何,(id1,id2)
必须是唯一的?因此,如果我尝试将插入到最短值(2,1,…)
中,并且已经存在(1,2,…)
的记录,插入会失败吗
我无法理解这一点:/
注意:如果需要,更改db结构是可以的,这是一个新项目。在一般情况下,这可以通过触发器解决:
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)
);
创建表(
id1长,
id2长,
...,
唯一的(id1,id2),
检查(id1
SQLite是否支持表达式上的索引?在Postgres中,您可以使用:创建唯一索引idx\u id\u unique on shortest(least(id1,id2),magest(id1,id2))
查看it文档,我想说不,它不检查(id1