假设我有两张桌子。在叫做人和一个叫做会议。 People表具有以下列:iId(主键,串行)和sName(varchar(30))。会议有以下列: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'
有什么想法吗?
答案 0 :(得分: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);
如果采用这种方法,那么某些insert
和update
将失败,因为这些人的顺序错误。这可以通过触发器或应用程序级逻辑来处理。