看看下面的情况,到底是什么意思?“fromCity”和“toCity”都是字符串,所以比较这两者有什么意义吗?
我们的目标是找到一个解决方案,如果表已经有了从X到Y的距离,那么它就永远不会存储从Y到X的距离。

CREATE TABLE Distances (
fromCity TEXT,
toCity TEXT,
distance INT,
CONSTRAINT only_one_direction CHECK (fromCity < toCity)
) ;

最佳答案

您需要一个唯一的约束(或索引)来确保这一点。check约束本身不会阻止再次添加相同的组合(它还对客户端在插入之前对两个名称进行排序施加了一些限制)。
更好的方法是使用唯一索引,确保只能存储一个组合:

CREATE TABLE distances
(
  fromcity TEXT,
  tocity TEXT,
  distance INT,
);
create unique index on distances ( least(fromcity,tocity), greatest(fromcity,tocity) );

表达式索引将始终按相同的顺序存储城市,从而确保组合是唯一的。

10-07 12:35