SQL 断言

本文最后更新于:2024年3月18日 凌晨

SQL 断言

  • 在SQL中可以使用数据定义语言中的CREATE ASSERTION语句,通过声明性断言(declarative assertions)来指定更具一般性的约束,可以定义设计多个表或聚集操作的比较复杂的完整性约束,断言创建以后,任何对断言中所涉及关系的操作都会触发关系数据库管理系统对断言的检查,任何使断言不为真值的操作都会被拒绝执行。

创建断言的语句格式

1
CREATE ASSERTION<断言名><CHECK子句>
  • 每一个断言都被赋予一个名字,<CHECK子句>中的约束条件于WHERE子句的条件表达式类似。

[例5.18]:限制数据库课程最多60名学生选修。

1
2
3
4
5
CREATE ASSERTION ASSE_SC_DB_NUM
CHECK(60>=(SELECT COUNT(*) /*此断言的谓词涉及聚集操作COUNT的SQL语句*/
FROM Course.SC
WHERE SC.Cno=Course.Cno AND Course.Cname='数据库')
);
  • 每当学生选修课程时,将在SC表中插入一条元组(Sno,Cno,NULL),ASSE_SC_DB_NUM断言被触发检查,如果选修数据库课程的人数已经超过60人,CHECK子句返回值为"假",对SC表的插入操作被拒绝。

[例5.19]:限制每一门课程最多60名学生选修。

1
2
3
4
5
CREATE ASSERTION ASSE_SC_CNUM1--限制每一门课程最多60名学生选修。
CHECK(60>=ALL(SELECT COUNT(*) /*此断言的谓词,涉及聚集操作COUNT和分组函数GROUP BY的SQL语句*/
FROM SC
GROUP BY Cno)
);

[例5.20]:限制每个学期每一门课程最多60名学生选修。

首先修改SC表达模式,添加一个"学期(TERM)"的属性。

1
2
ALTER TABLE SC
ADD TERM DATE;/*先修改SC表,增加TERM属性,它的类型是DATE*/

然后定义断言:

1
2
3
4
5
CREATE ASSERTION ASSE_SC_CNUM2
CHECK(60>=ALL(SELECT COUNT(*)
FROM SC
GROUP BY Cno,TERM)
);

删除断言的语句格式

1
DROP ASSERTION<断言名>;

如果断言很复杂,则系统在检测和维护断言上的开销较高,这是在使用断言时应该注意的。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!