第八天 -- 《2014-07-15 三层架构》1 -- 触发器、索引、临时表
一、上午《01、触发器》 -- 触发器
1、创建触发器
触发器相当于一个特殊的存储过程,被DBMS调用。
触发器的事件只能是表的insert/ delete / update操作。
SqlServer触发器的触发方式有两种:(1)在表(增删改)操作后(after)触发,(2)在操作前触发,此时表操作被替换为执行触发器中定义的sql代码。
--语法:
--create trigger tr_触发器名称
--on 表名 after(或者for)/ instead of insert/ delete / update
--as
-- 任意的逻辑代码或 存储过程
--go
1 --创建触发器例子一: 2 if exists(select * from sysobjects where name='tr_grade_insert') 3 drop trigger tr_grade_insert 4 go 5 6 create trigger tr_grade_insert 7 on grade for insert --为grade表创建触发器,在你对grade表进行插入操作后触发,for和after等效 8 as 9 select * from student --可以有若干sql语句、事务、存储过程调用 10 go
2、inserted、deleted临时表
在delete数据的时候,可以假定数据库将要删除的数据放到一个deleted临时表中,我们可以向读取普通的表一样,select 字段 from deleted 。
而insert的时候道理一样,只不过是把要插入的数据放在inserted表中。
更新操作可以认为是执行了两个操作,先把那一行记录delete掉,然后再insert,所以deleted就是更新前的数据,inserted是更新后的数据。所以就不再有updated表了。
(1)以inserted为例说明这两个临时表
--在插入的时候,输出插入记录(作为结果集) insert into grade output inserted.id, inserted.classname values('亲爱sdas的') --结果集为插入的一条记录 --删除记录的时候,输出删除了哪些(作为结果集) delete from OdsPC output deleted.* where id > 7 --结果集为删掉的那几条记录

(2)在 触发器中使用inserted和deleted临时表
1 --插入后触发器查询两个临时表 2 if exists(select * from sysobjects where name='tr_grade_insert') 3 drop trigger tr_grade_insert 4 go 5 create trigger tr_grade_insert 6 on grade for insert --为grade表创建触发器,在你对grade表进行插入操作后触发 7 as 8 print 'inserted表存储操作之后的 与当前操作相关的数据,而与之前表的数据无关' 9 select * from inserted 10 print 'deleted表存储操作之前的数据' 11 select * from deleted 12 go 13 14 insert into grade values('亲爱sdas的') 15 16 if exists(select * from sysobjects where name='tr_grade_delete') 17 drop trigger tr_grade_delete 18 go 19 create trigger tr_grade_delete 20 on grade after delete --为grade表创建触 发器,在你对grade表进行插入操作后触 发 21 as 22 print 'inserted表存储操作之后的 与当前操作相关的数据,而与之前表的数据无关' 23 select * from inserted 24 print 'deleted表存储操作之前的数据' 25 select * from deleted 26 go 27 28 delete from grade where ClassId>18 29 30 if exists(select * from sysobjects where name='tr_grade_update') 31 drop trigger tr_grade_update 32 go 33 create trigger tr_grade_update 34 on grade after update --为grade表创建触 发器,在你对grade表进行插入操作后触 发 35 as 36 print 'inserted表存储操作之后的 与当前操作相关的数据,而与之前表的数据无关' 37 select * from inserted 38 print 'deleted表存储操作之前的数据' 39 select * from deleted 40 go 41 42 update grade set classname='aaaaa' where ClassId>16
3、注意
(1)SQLServer对某表的某个操作(如insert)允许定义多个触发器(名字不一样)。
当该操作执行时,DBMS会分别调用它们。最后产生的结果可能不是你所期望的那样。所以一个表的一个操作,最好只定义一个触发器。
二、上午《02、索引》-- 提高检索速度
1、索引的概念
(1)对数据进行检索(select)效率最差的是全表扫描,就是一条条的找。
(2)如果没有目录而且汉字无序排版,查汉语字典就要一页一页翻,而有了目录(汉字按拼音排序)只要查询目录即可。为了提高检索的速度,可以为经常进行查询的列添加索引,相当于创建目录。(实际上是每个索引)
(3)索引意味着排序,排序后则可更高效的查询。
(4)创建索引的方式,在表设计器中点击右键,选择“索引/键”→添加→在列中选择索引包含的列。
(5)使用索引能提高查询效率,但是索引也是占据空间的,而且添加、更新、删除数据的时候也需要同步更新索引,因此会降低Insert、Update、Delete的速度。只在经常检索的列上(经常用在Where子句中的列)创建索引。
(6)即使创建了索引,仍然有可能全表扫描,比如like、函数、类型转换等。
(7)创建索引: create index IX_Student_studentname on Student(studentname) --on 表(列)
删除索引: drop index T8.IX_T8_tage
1 if exists(select * from sysindexes where name = 'IX_Student_studentname') 2 drop index Student.IX_Student_studentname 3 go 4 5 create clustered index IX_Student_studentname --创建一个聚集的索引。非聚集索引用 nonclustered 6 on Student(studentname) -- on 表(列)
(8)索引的命名:IX_Employee_LoginID(即 IX_表名_列名)
2、按照索引排序(改动了原始表的排序)
(1)主键就是一种索引
(2)创建索引时,“创建为聚集的”设置为true后,表中的数据内容就会按照该索引列排序。(一张表中只能有一个索引或主键是聚集的)
表中没有聚集索引的,默认按照主键排序
三、《03、自定义临时表》
自定义临时表创建后存放在系统数据库tempdb临时表之下
1、使用场景举例
如何将原始表的自增长主键值重新开始(从1再排一遍)?
(1)先用原始表student数据select into 临时表#newtemp。
(2)truncate 原始表student。
(3)再将临时表数据插入原始表。insert into student select * from #newtemp
1 --使自增长主键值重新开始排 2 select * into #newtemp from grade 3 truncate table grade 4 insert into grade select classname from #newtemp
2、局部临时表(只针对当前对话使用)
表名加前缀# 如: #StuTemp
--局部临时表:只能在当前创建临时表的会话中使用。如果关闭了这么会话,那么临时表就自动消失 create table #temp ( --字段名称 类型 特征 cid int , cname nvarchar(50) )
3、全局临时表(只要创建全局临时表的会话没结束,所有会话都可以访问这个全局临时表)
表名加前缀## 如:##Temp
1 --全局临时表只要不关闭当前会话,那么在其它会话中还是可以使用,但是如果关闭当前会话,那么临时也会消失 2 create table ##temp 3 ( 4 --字段名称 类型 特征 5 cid int , 6 cname nvarchar(50) 7 ) 8 insert into ##temp select * from grade 9 truncate table grade 10 insert into grade select cname from ##temp
4、临时表总结

浙公网安备 33010602011771号