【问题标题】:Prevent Unique Data From Being Inserted into Table防止将唯一数据插入表中
【发布时间】:2014-07-21 05:39:24
【问题描述】:

假设我有两张桌子。一个叫“人”,一个叫“会议”。 People 表具有以下列:iId(主键,序列号)和 sName(varchar(30))。 Meetings 具有以下列:iId(主键,序列号)、iPerson1(People 表中条目的 iId)、iPerson2(People 表中条目的 iId)和 dtDate(日期)。

我想对 Meetings 表设置一个约束,这样我就不会得到两个具有相同两个人但在不同列和相同日期的行。我想避免:

iid    iPerson1    iPerson2    dtDate
1      1           2           '2013-01-01'
2      2           1           '2013-01-01'

有什么想法吗?

【问题讨论】:

    标签: sql postgresql


    【解决方案1】:

    会议仅限于两个人似乎很奇怪。如果是这样的话,你的数据结构没问题,但我希望有一个MeetingsPeople 联结表。

    您可以通过多种方式完成您想要的。一种方法是使用功能索引:

    create unique index idx_meetings_3
        on meetings(least(iPerson1, iPerson2), greatest(iPerson1, iPerson2), dtdate);
    

    另一种方法是结合两个约束。一个是对三列的唯一约束,另一个是要求 iPerson1 小于 iPerson2:

    create unique index idx_meetings_3 on meetings(iPerson1, iPerson2, dtdate);
    
    check (iPerson1 < iPerson2);
    

    如果您采用这种方法,那么某些inserts 和updates 将失败,因为这些人的顺序错误。这可以由触发器或应用程序级逻辑来处理。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-06
      • 1970-01-01
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 2012-02-06
      • 1970-01-01
      相关资源
      最近更新 更多