看看下面的情况,到底是什么意思?“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) );
表达式索引将始终按相同的顺序存储城市,从而确保组合是唯一的。