安全性和完整性常常混淆。安全性是指保护数据以防止非法用户故意造成破坏;完整性是保护数据以防止合法用户无意中造成破坏。
SQL中把完整性约束分为三大类:域约束、基本表约束和断言。
可以用“CREATE DOMAIN” 语句定义新的域,并且还可以出现CHECK子句。
定义一个新的域COLOR,可以用下列语句实现:
CREATE DOMAIN COLOR CHAR(6) DEFAULT '???'
CONSTRAINT VALID_COLORS
CHECK( VALUE IN
( 'Red','Yellow','Blue','Green','???'));
此处第二行表示为这个域约束起一个名字VALID_COLORS。假定有一张表:
CREATE TABLE PART
( ...,
COLOR COLOR,
...);
如果用户插入一个元组时未提交颜色的值,默认为‘???’。如果用户输入了非法值,则操作失败,系统将产生一个约束名为VALID_COLORS的诊断信息。
SQL的基本表约束主要有三种形式:候选键定义、外键定义和“检查约束”定义。这些定义都可以在前面加“CONSTRAINT<约束名>“,由此为新约束起一个名字。为简化下面都省略这一选项。
候选键的定义形式为:
UNIQUE (<列名序列>)
或
PRIMARY (<列名序列>)
外键的定义形式为:
FOREIGN KEY (<列名序列>)
REFERENCES <参照表> [(<列名序列>)]
[ON DELETE<参照动作>]
[ON UPDATE<参照动作>]
第一行的列名序列是外键,第二行的列名序列是参照表中的主键或候选键。参照动作有五种方式:
这种约束是对单个关系的元组值加以约束。方法是在关系定义中任何需要的地方加上关键字CHECK和约束的条件:
CHECK (<条件表达式>)
比如在教学数据库中,要求学生关系中存储的学生信息满足:男同学年龄在15~35之间,女同学年龄在15~30之间:
CHECK (AGE >= 15 AND ((SEX = 'M' AND AGE <= 35)
OR (SEX = 'F' AND AGE <= '30')));
断言的定义如下:
CREATE ASSERTION <断言名> CHECK (<条件>)
撤销断言的方法如下:
DROP ASSERTION <断言名>
例如:每门课最多50名学生选修:
CREATE ASSERTION ASSE3 CHECK
( 50>= (SELLECT COUNT (SC.S#)
FROM S,SC
WHERE S.S#=SC.S# AND SEX='M'
GROUP BY C#));