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

标签 sqlite

我需要在 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/

相关文章:

Android sqlite - 选择字段为空或为空的记录

iphone - Firefox SQLite Manager无法访问Xcode iPhone模拟器SQLite DB目录

sql - 使用DISTINCT和LIMIT的子查询

iphone - SQLite 或 Core Data 用于只有查询的大型数据库

sqlite - Scala Slick 和 SQLite

android - 如果应用程序崩溃或被手动终止,如何清除数据?

与 SQlite 一起使用的 Delphi 组件

java - 如何使用 Java 拆分 sql 查询

java - onActivityResult() 和 : failure delivering result resultinfo who=null request=1 result=-1 data=intent (has extras)

android - SQLite Android 获得不同的值