Postgresql 如果距离X到Y已经存在,请确保表格从不存储从Y到X的距离

Postgresql 如果距离X到Y已经存在,请确保表格从不存储从Y到X的距离,postgresql,ddl,Postgresql,Ddl,看看下面的情况,它到底意味着什么?“fromCity”和“toCity”都是字符串,所以比较这两个词有意义吗 我们的目标是找到一种解决方案,确保表格在已经具有从X到Y的距离时,不会存储从Y到X的距离 CREATE TABLE Distances ( fromCity TEXT, toCity TEXT, distance INT, CONSTRAINT only_one_direction CHECK (fromCity < toCity) ) ; 创建表格距离( 来自城市文本, 城市文

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

我们的目标是找到一种解决方案,确保表格在已经具有从X到Y的距离时,不会存储从Y到X的距离

CREATE TABLE Distances (
fromCity TEXT,
toCity TEXT,
distance INT,
CONSTRAINT only_one_direction CHECK (fromCity < toCity)
) ;
创建表格距离(
来自城市文本,
城市文本,
距离INT,
仅约束一个方向检查(从城市到城市)
) ;

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

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

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

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

是的,这很有意义。只存储柏林->巴黎,不允许巴黎->柏林。@jarlh:该检查约束不能确保这一点。在
(fromcity,tocity)
上需要一个唯一的约束well@a_horse_with_no_name我正在使用Postgres@a_horse_with_no_name,我知道它不完美,但它能工作。@jarlh我还在想你怎么能比较两个这样的字符串?如果我们在“fromcity”中存储“Berlin”,在“toCity”中存储“Paris”,编译器如何知道哪一个是最好的呢?太好了!PostgreSQL再次以正确的方式实现了这一点。