数据库完整性总结

完整性和安全性

  • 数据库完整性是指数据库的正确性、有效性和相容性,防止错误数据进入数据库。
  • 数据库安全性是指保护数据库,防止不合法的引用,以免数据的泄密、更改或破坏。

安全性和完整性常常混淆。安全性是指保护数据以防止非法用户故意造成破坏;完整性是保护数据以防止合法用户无意中造成破坏。

完整性约束

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<约束名>“,由此为新约束起一个名字。为简化下面都省略这一选项。

1、候选键定义

候选键的定义形式为:

UNIQUE (<列名序列>)
或
PRIMARY (<列名序列>)
  • UNIQUE定义表的候选键,但只表示值是唯一的,值非空还需要在列定义时带有选项NOT NULL。
  • PRIMARY 方式定义表的主键,一个基本表只能指定一个主键。当是主键时会被自动认为是非空的。

2、外键定义

外键的定义形式为:

FOREIGN KEY (<列名序列>)
    REFERENCES <参照表> [(<列名序列>)]
        [ON DELETE<参照动作>]
        [ON UPDATE<参照动作>]

第一行的列名序列是外键,第二行的列名序列是参照表中的主键或候选键。参照动作有五种方式:

  • NO ACTION方式:对依赖表没有影响。
  • CASCADE方式:参照表中要删除/修改主键值,将依赖表中对应的外键值也删除/修改。
  • RESTRICT方式:依赖表没有一个外键值和参照表主键值对应,系统才能执行删除/修改操作。
  • SET NULL方式:删除/修改参照表中元组时,将依赖表中相关外键值设为空值。
  • SET DEFAULT方式:与上述方法类似,设置为预先设置好的默认值。

3、”检查约束“定义

这种约束是对单个关系的元组值加以约束。方法是在关系定义中任何需要的地方加上关键字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#));

 

猜你喜欢

转载自my.oschina.net/HuoQibin/blog/1812254