SQL 中是否有一种方法可以强制执行无向边的唯一性?

Is there in SQL a way to enforce unicity of undirected edge?

create table Location (
id integer primary key(1, 1),
latitude decimal(8,6),
longitude decimal(9,6),
address varchar(100),
name varchar(60) unique
);

create table Journey (
id integer primary key(1,1),
id_from integer foreign key references Location(id),
id_to integer foreign key references Location(id),
name varchar(100) unique,
unique(id_from, id_to)
);

使用此架构,您可以为一对位置创建 2 条不同的旅程,一条用于进站,一条用于返回。我想要的是为每对位置强制执行一次旅程。有哪些选择可以做到这一点?

最简单的方法是强制执行“方向”,然后使用唯一约束:

create table Journey (
    id integer primary key,
    id_from integer foreign key references Location(id),
    id_to integer foreign key references Location(id),
    name varchar(100) unique,
    unique(id_from, id_to),
    check (id_from < id_to)
);

但是您必须记住插入值,以便使用触发器确保它们是有序的。

否则,您可以对最小值和最大值使用计算列,然后对其使用唯一约束。

您可以使用 sum 和 product 计算列强制无向边的唯一性:

create table Location (
  id integer primary key(1, 1),
  latitude decimal(8,6),
  longitude decimal(9,6),
  address varchar(100),
  name varchar(60) unique
);
create table Journey (
  id integer primary key identity(1,1),
  id_from integer foreign key references Location(id),
  id_to integer foreign key references Location(id),
  s as id_from + id_to persisted,
  p as id_from * id_to persisted,
  unique(s, p),
  name varchar(100) unique,
);

是为每对位置强制执行单程(进出或返回)的正确方法。二次方程最多有两个解。它至少有 id_from 和 id_to。所以方程 xx - sx + p=0 总是恰好有 2 个解,即 id_from 和 id_to。你可以在那里看到数学解释 https://math.stackexchange.com/questions/171407/finding-two-numbers-given-their-sum-and-their-product