Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在sqlite3中,无论顺序如何,如何表示对唯一值对的检查?_Sqlite - Fatal编程技术网

在sqlite3中,无论顺序如何,如何表示对唯一值对的检查?

在sqlite3中,无论顺序如何,如何表示对唯一值对的检查?,sqlite,Sqlite,我需要在sqlite3数据库中表达路径数据。我有图形,我需要保存一些顶点之间的最短路径。现在,因为我的图是双向的,所以A和B之间的最短路径将与B和A之间的路径相同 我当前的数据库结构如下所示: create table shortest ( id1 long, id2 long, ... ); 现在,我如何表达约束,即无论顺序如何,(id1,id2)必须是唯一的?因此,如果我尝试将插入到最短值(2,1,…)中,并且已经存在(1,2,…)的记录,插入会失败吗 我无法理解这

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

我当前的数据库结构如下所示:

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是一个很好且简短的解决方案,谢谢:)