利用SQL语言实现数据库的静态完整性
目录:1.静态约束的形式和内容
2.SQL语言实现约束的方法:Create Table(列约束和表约束)
3.SQL语言实现约束的方法:断言
1.SQL约束
(1)静态约束
1)列完整性——域完整性约束
2)表完整性——关系完整性约束
(2)动态约束:触发器
2.静态约束的约束规则的一般形式
Integrity Constraint ::= (O, P, A, R)
(1)O:列或者表
(2)P:需要定义
(3)A:更新时检查(默认)
(4)R:拒绝(默认)
3.SQL语言实现约束的方法(1)——Create Table
(1)Create Table的三种功能:定义关系模式,定义完整性约束,定义物理存储特性
(2)定义完整性约束条件
1)列完整性
2)表完整性
(3)CREATE TABLE的定义格式
CREATE TABLE tablename
(( colname datatype [ DEFAULT { default_constant | NULL } ] //列约束
[ col_constr { col_constr ... } ] | , table_constr //表约束
{, { colname datatype [ DEFAULT { default_constant | NULL } ]
[ col_constr { col_constr ... } ] | , table_constr }
... } );
(4)Create Table包含Col_constr列约束和Table_constr表约束
4.Col_constr列约束
(1)一种域约束类型,对单一列的值进行约束
(2)格式
{ NOT NULL | //列值非空
[ CONSTRAINT constraintname ] //为约束名,便于以后撤销
{ UNIQUE //列值是唯一
| PRIMARY KEY //列是主键
| CHECK (search_cond) //(谓词,为真时更新才能允许)列值满足条件,条件只能使用列当前值
| REFERENCES tablename [(colname)] //references表明将这一列定义为外键,colname 省略表明该列名和另一个表tablename的主键名相同;若不省略,应说明tablename的哪一列对应此外键列
[ON DELETE { CASCADE | SET NULL}] } } //关联性删除问题:若加上 ON DELETE子句,则“若删除tablename中的一个元组,该元组中有一个属性值与外键对应,外键对应的该行应该被删除”
//引用另一个表tablename 的列colname的值,如有 ON DELETE CASCADE 或 ON DELETE SET NULL语句,则删除被引用表的某列值 v 时,要将本表该列值为 v 的记录删除或列值更新为 null;缺省为无操作
(3)Col_constr 列约束:只能应用在单一列上,其后面的约束如UNIQUE, PRIMARY KEY 及 search_cond 只能是单一列唯一,单一列为主键,单一列相关
5.Col_constr列约束举例
Create Table Student (S# char(8) not null unique, //S#是主键
Sname char(10),
Ssex char(2) constraint ctssex check (Ssex = '男' or Ssex = '女'), //定义了一个约束 ctssex(可单独处理),谓词检查
Sage integer check (Sage > 1 and Sage < 150), //整形年龄,无约束名(无法单独处理),谓词检查
D# char(2) references Dept(D#) on delete cascade, //如果Dept中删除某一元组,将Student表中涉及到D#的同学的信息全部删除
Sclass char(6) );
(2)Create Table Course ( C# char(3),
Cname char(12),
Chours integer,
Credit float(1) constraint ctcredit check (Credit >= 0.0 and Credit <=5.0), //定义名叫 ctcredit 的约束,学分在0.0-5.0之间
T# char(3) references Teacher(T#) on delete cascade ); //定义关联性删除
6.table_constr 表约束
(1)一种关系约束类型,对多列或元组的值进行约束
(2)[ CONSTRAINT constraintname ] //约束命名,便于以后撤销
{ UNIQUE (colname{, colname ...}) //几列值组合在一起是唯一
| PRIMARY KEY (colname {, colname ...}) //几列联合为主键
| CHECK (search_condition) //元组多列值共同满足条件,条件中只能使用同一元组的不同列当前值
| FOREIGN KEY (colname {, colname ...})
REFERENCES tablename [(colname {, colname ...})]
[ON DELETE CASCADE] } //引用另一个表的若干列作为外键
(3)table_constr表约束:是应用在关系上,即对关系的多列或元组进行约束,列约束是其特例
7.Table_constr表约束举例
(1)Cteate Table Student ( S# char(8) not null unique,
Sname char(10),
Ssex char(2) constraint ctssex check (Ssex = '男' or Ssex = '女'), //也可以用列约束来定义
Sage integer check (Sage > 1 and Sage < 150),
D# char(2) references Dept(D#) on delete cascade,
Sclass char(6),
primary key(S#));
(2)Create Table Course ( C# char(3),
Cname char(12),
Chours integer,
Credit float(1) constraint ctcredit check (Credit >= 0.0 and Credit <= 5.0),
T# char(3) references Teacher(T#) on delete cascade,
primary key(C#), constraint ctcc check (Chours/Credit = 20)); //涉及Chours和Credit两列,必须用表约束
(3)Create Table SC (S# char(8),
C# char(3),
Score float(1) constraint ctscore check (Score >= 0.0 and Score <=100.0),
foreign key(S#) references student(S#) on delete cascade,
foreign key(C#) references course(C#) on delete cascade ); //定义了两个外键
(4)包含Select-From-Where子查询的check语句
Create Table SC (S# char(8) check ( S# in (select S# From Student) ), //相当于外键,涉及到表Student
C# char(3) check( C# in (select C# From Course) ), //相当于外键,涉及到表Course
Score float(1) constraint ctscore check (Score >= 0.0 and Score <= 100.0) );
8.Create_Table的撤销和追加(仅了解即可)(表定义结束后,通过Alter Table调整表的信息)
(1)撤销或追加约束的语句:Alter Table
(2)ADD CONSTRAINT constr_name //新增一个约束
(3)DROP CONSTRAINT constr_name //撤销一个约束
(4)DROP PRIMARY KEY //撤销一个主键
(5)MODIFY //新增一个约束的关键词
9.SQL语言实现约束的方法(2)——断言
(1)断言:一个断言就是一个谓词表达式,表达了希望数据库总能满足的条件
(2)列约束和表约束是一些特殊的断言
(3)复杂断言的语法形式
CREATE ASSERTION
(4)当一个断言创建后,系统将检测其有效性,并在每一次更新中测试更新是否违反该断言
(5)断言测试增加了数据库维护的负担,要谨慎使用复杂的断言,但是断言能解决复杂约束
10.断言应用举例
(1)每笔贷款,要求至少以为借款者账户中存有最低数目的余额,例如1000元
borrower(customer_name, loan_number, ...) //客户及其贷款(一笔贷款的借款者) account(account_number, ... ,balance) //账户及其余额 depositor(account_number, customer_name) //客户及其账户(借款者的账户) loan(loan_number, amount) //每一笔贷款
Create assertion balance_constraint check
(not exists (
select * From loan Where not exists (
Select * From borrower, depositor, account
Where loan.loan_number = borrower.loan_number
and borrower.customer_name = depositor.customer_name
and depositor.account_number = account.account_number
and account.balance >= 1000)))