你的位置:首页 > 数据库

[数据库]数据库复习⑧


数据库复习⑧

2016年6月18日

21:23

Main Integrity Constraints 实体完整性约束

1.各种约束

Keys

Foreign-key 外键 引用完整性约束

Value-based constraints 值约束

Tuple-based constraints 元组约束

Assertions 断言

2.Key Constrains

Primary Key:

CREATE TABLE branch(

bname CHAR(15) PRIMARY KEY,

bcity CHAR(20),

assets INT);

or

CREATE TABLE depositor(

cname CHAR(15),

acct_no CHAR(5),

PRIMARY KEY(cname, acct_no));

Candidate Keys:

CREATE TABLE customer (

ssn CHAR(9) PRIMARY KEY,

cname CHAR(15),

address CHAR(30),

city CHAR(10),

UNIQUE (cname, address, city);

clip_image002

3.Attribute Constraints

clip_image003

clip_image004

clip_image005

4.Foreign Keys外键

主键、外键和索引的区别?

 

主键

外键

索引

定义:

唯一标识一条记录,不能有重复的,不允许为空

表的外键是另一表的主键, 外键可以有重复的, 可以是空值

该字段没有重复值,但可以有一个空值

作用:

用来保证数据完整性

用来和其他表建立联系用的

是提高查询排序的速度

个数:

主键只能有一个

一个表可以有多个外键

一个表可以有多个惟一索引

1、外键引用的是需要其它表的主键,或者候选键。

2、外键创建之后并不会自动创建索引,这个是有开发人员自己考虑在外键上建相关索引是否能获取到查询效率上的提升

3、默认的情况下如果在引用表插入不存在的外键值或者在主表删除了一个被引用的数据,数据库都会报错。

clip_image007

clip_image008

5.Global Constraint: Assertions 全局限制 断言

CREATE ASSERTION <name>

CHECK ( <condition> );

clip_image009

6.Trigger 触发器

语法:

DELIMITER |

CREATE TRIGGER `<databaseName>`.`<triggerName>`

< [ BEFORE | AFTER ] > < [ INSERT | UPDATE | DELETE ] >

ON [dbo]<tableName> //dbo代表该表的所有者

FOR EACH ROW

BEGIN

--do something

END |

触发器(trigger)是SQL server 提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,它的执行不是由程序调用,也不是手工启动,而是由事件来触发,比如当对一个表进行操作( insert,delete, update)时就会激活它执行。触发器经常用于加强数据的完整性约束和业务规则等。

DML触发器

当数据库中表中的数据发生变化时,包括insert,update,delete任意操作,如果我们对该表写了对应的DML触发器,那么该触发器自动执行。DML触发器的主要作用在于强制执行业 务规则,以及扩展Sql Server约束,默认值等。因为我们知道约束只能约束同一个表中的数据,而触发器中则可以执行任意Sql命令。

DDL触发器

它是Sql Server2005新增的触发器,主要用于审核与规范对数据库中表,触发器,视图等结构上的操作。比如在修改表,修改列,新增表,新增列等。它在数据库结构发生变化时执行,我们主要用它来记录数据库的修改过程,以及限制程序员对数据库的修改,比如不允许删除某些指定表等。

举例:

插入时:

create trigger tri_insert

on student

for insert

as

declare @student_idchar(10)

select @student_id=s.student_id from students

inner join insertedion s.student_id=i.student_id

if @student_id='0000000001'

begin

raiserror('不能插入1的学号!',16,8)

rollbacktran

end

go

更新时:

create trigger tri_update

on student

for update

as

if update(student_id)

begin

raiserror('学号不能修改!',16,8)

rollbacktran

end

go

删除时:

create trigger tri_delete

on student

for delete

as

declare @student_idvarchar(10)

select @student_id=student_id from deleted

if @student_id='admin'

begin

raiserror('错误',16,8)

rollbacktran

End

clip_image011

clip_image013

clip_image015