用SQL表示数据约束

用SQL表示数据约束,sql,Sql,我正在为我妻子写一份日程安排申请,我遇到了以下问题 我有一个可以用ActiveRecord术语描述的模式: 每个资源都有并属于许多事件 每个事件都有并属于许多资源,并且有许多时间跨度 每个timespan都属于一个事件,并具有三个属性:天、开始时间和结束时间 我想对我的数据设置以下约束: A. For each timespan, timespan.start-time ≤ timespan.end-time B. For each event, for each t_a, t

我正在为我妻子写一份日程安排申请,我遇到了以下问题

我有一个可以用ActiveRecord术语描述的模式:

  • 每个资源都有并属于许多事件
  • 每个事件都有并属于许多资源,并且有许多时间跨度
  • 每个timespan都属于一个事件,并具有三个属性:天、开始时间和结束时间
我想对我的数据设置以下约束:

A. For each timespan, timespan.start-time ≤ timespan.end-time B. For each event, for each t_a, t_bTIMESPANS(event), either t_a = t_b or t_a.day ≠ t_b.day or t_a.end-time ≤ t_b.start-time or t_a.start-time ≥ t_b.end-time C. For each resource, for each e_a, e_bEVENTS(resource), either e_a = e_b or for each t_aTIMESPANS(e_a) and t_bTIMESPANS(e_b), either t_a.day ≠ t_b.day or t_a.end-time ≤ t_b.start-time or t_a.start-time ≥ t_b.end-time A.对于每个timespan,timespan.start-time≤ timespan.end-time B.对于每个事件,对于每个t_a,t_B∈ 时间跨度(事件), t_a=t_b 或者一天一次≠ 托比日 或者t_a.结束时间≤ 开始时间 或者说开始时间≥ 结束时间 C.对于每个资源,对于每个e_a,e_b∈ 事件(资源), e_a=e_b 或者每一个t_a∈ 时间跨度(e_a)和t_b∈ 时间跨度(e_b), 一天两次≠ 托比日 或者t_a.结束时间≤ 开始时间 或者说开始时间≥ 结束时间 (A) 确保时间跨度的格式正确,(B)确保事件不会自我冲突,(C)确保资源不会过度调度

目前,我正在应用程序层强制执行这些约束,但是,出于自学习的目的,我想知道是否可以将这些约束放在数据库层

有什么方法可以用SQL表达这些约束吗

编辑:
所以我发现我想要的是SQL的
CREATE ASSERTION
语句(至少对于那些不能被简单的
CHECK
覆盖的语句),但它似乎不像任何支持它的RDBMS()

a可以很容易地用timespan表上的
CHECK约束表达出来,因为每一行都可以在不检查任何其他行的情况下检查自身的一致性

B和C更复杂,需要从其他表格中读取信息。在这种情况下(至少在SQL Server中),可以使用用户定义的函数(将当前行中的值传递给它)来检查其他表,也可以使用
触发器来检查其他表

注意:在编写这样的触发器时,请记住,对于SQL语句,触发器只触发一次。如果该语句
INSERT
s或
UPDATE
s多行,则
INSERTED
表将包含多行,应使用适当的技术(如
JOIN
)检查所有行,以匹配域约束


顺便说一句:乔·塞尔科最近有一次关于限制的谈话。

你在安排你妻子的日程吗?;-)谢谢这很有帮助。