如果距离X到Y已存在,则保证表永远不会存储从Y到X的距离

时间:2018-02-04 10:19:36

标签: postgresql ddl

看看下面的情况,它到底意味着什么? 'fromCity'和'toCity'都是字符串,所以比较这两者是否有意义?

目标是找到一个解决方案,保证表格永远不会存储从Y到X的距离,如果它已经有从X到Y的距离。

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

1 个答案:

答案 0 :(得分:3)

您需要一个唯一约束(或索引)来确保这一点。仅检查约束不会阻止再次添加相同的组合(它还会对客户端施加一些限制,以便在插入之前对两个名称进行排序)。

更好的方法是一个唯一的索引,确保只能存储一个组合:

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

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