【问题标题】:PostgreSql - unique rows, independent of orderPostgreSql - 唯一的行,独立于顺序
【发布时间】:2016-09-04 18:26:18
【问题描述】:

我在当前的问题上遇到了一些困难

一个成员与另一个成员匹配 - 它只能出现一次。

假设我们有一个方案,其中包含一个名为 Member 的表和另一个名为 Match 的表

   Member
-------------
| id | name |
-------------
| 1  | bob  |
| 2  | tim  |



      Match
------------------------
| memberid | requestid |(memberid is a foreign key to member same as requestid)
-------------------------
| 1        |     2     |

但是现在一个请求来自 memberid 2 并且它应该拒绝它,我正在尝试找到该类型约束或索引的名称。这是唯一的/匹配的,但与哪一列无关。

所以这应该是无效的

      Match
------------------------
| memberid | requestid |(memberid is a foreign key to member same as requestid)
-------------------------
| 1        |     2     |
| 2        |     1     |

我唯一的想法是在memberid <> requestid 处添加一个约束。但我认为可能有更好的方法

【问题讨论】:

    标签: sql database postgresql database-design


    【解决方案1】:

    如果您试图只有一行成对,那么您可以使用唯一约束。关键是在表达式上建立唯一索引:

    create unique index unq_matches_memberid_requestid
        on matches(least(memberid, requestid), greatest(memberid, requestid));
    

    【讨论】:

    • 整洁!我尝试弄乱alter table add unique CONSTRAINT 语法,但无法正常工作。今天学到了一些东西,谢谢!
    • 啊!它的工作原理我只是不完全理解为什么,为什么传入 minimum(memberid,requestid) 和 best(memberid,requestid) 突然使它成为一个独特的行/列(测试完美地完成了我只是不明白这是怎么回事规则有效)
    • 哦,我看到了一个表达式,它允许我们获取两个值,所以最小的将获得一个值,而最大的将给我们另一个值,然后我们对表达式而不是列设置唯一约束
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    相关资源
    最近更新 更多