数据库对于其内部的数据应该是有要求的,即只有合法的数据才能被写入数据库中,这个合法的法一方面是由用户自己定义(用户自定义完整性),一部分是系统需求(实体完整性约束以及参照性约束)。DB Integrity 是DBMS应保证的DB的一种特性,即数据的正确性有效性和一致性。
其完整性约束的定义为:IC(Integrity Constraint) ::= (O,P,A,R) (约束对象列、多列、元组,谓词条件(约束内容)、触发条件(何时检查),响应动作(begin))
DBI按对象不同可分为域IC和关系IC,前者是将限制施加于属性,后者是施加于一个关系中的若干元组和另一关系中的若干元组。
DBI按系统和用户可分为结构性约束(主键、外键约束,函数依赖)和内容约束(用户自定义约束)。
按触发方式可分为静态约束和动态约束。
一、静态约束 (O,P,A(默认更新即检查),R) 可对表进行约束、也可以对列进行
①、创建时的自定义语法结构如下:
Create Table Tablename(colname datetype [Defaut {Defaut_constraint | Null}] [col_constr {,col_constr...}] | ,table_constr ,{table_constr......});
其中第一个中括号为设置默认值,一般可忽略。
其二个中括号为限制条件,col_constr 列约束基本语法如下:
{Not Null | 该行不得为空
[constraint name ] 约束名
{Unique | primary key | check(search_condition)| References tablename [col_constr] (候选码,主键,检验,外键)
[On delete {cascade | set null}]} } (本表该属性为若为引用的另一表A的某列,当A中的该值删除时,本列置为空值null)
静态约束实例eg:
Create table student(S# char(8) not null unique, Sname char(10), Ssex char(2) constraint ctssex check(Ssex = '男' or Ssex = '女'), Sage int check(Sage >=1 and Sage <= 150),D# char(2) references Dept(D#) on delete cascade , Scalss char (6));
静态约束语法结构中还可以添加table_constr(第三个中括号),其基本格式与列约束一直,如下:
[constraint name ] 约束名
{Unique (colname {,colname,......})| primary key {,colname,......} | check(search_condition)|
Foreing key(colname {,colname,......}) \\外键和候选键主键可为组合键 ,check中只能为元组内的条件
[On delete {cascade | set null}]} } (本表该属性为若为引用的另一表A的某列,当A中的该值删除时,本列置为空值null)
②、使用断言Assertion
基本语法:
Create assertion
eg:
③、利用Alter命令修改约束
二、利用触发器(Trigger)设计动态约束
基本语法:
Create Trigger triggername Before | After 写入前or写入后执行
{Insert | Delete | Update [ of col_name {,colname,......} ] } 执行的对象和操作的对象
On tablename [ Refenrencing corr_name_def {,corr_name_def,......}] 指定约束对象
[For each row | For each statement] 每一行都检查还是写完一起检查
[when (search_condition)] 检查的条件,满足则执行下面程序
{statement | 执行的命令
begin atomic statement; {statement; ......} END};
eg: