触发器的关键词:
create trigger 触发器名---创建触发器
(一般触发器名格式前面为表名,后面为要控制的多做。如:StudentList_Delete-针对此表的删除动作)
on 表名---触发器所针对的表名
for delete--触发器对此表所执行的动作,for是指执行完此多做之后,这里用删除举例,执行完删除动作,将进行一下操作
as---执行完动作后要进行的操作,as以下就可以编写自己想要执行的操作
select * from StudentList-----此例是指当StudentList表执行完删除后进行查询整个表所有数据的操作
还有一种方式是替换此动作:instead of delete--这里是指如果对此表执行删除动作,将进行替换,也就是删除动作不能被执行,被替换为以下的操作
举例:
此触发器是指如果删除Student表中的一条数据,会将这个删除动作替换为查询显示要删除的数据
create trigger Student_delete on Student instead of delete as select * from deleted;
如:delete from Student where code='s101'
则会显示
这里简单写一个触发器:
create trigger Student_delete on Student instead of delete as declare @a nvarchar(200); select @a=code from deleted; if @a='s101' begin select '此人不可删除!' end else select '其他人也不可以!'
这个触发器是指如果Student表执行删除动作时,将执行替换,将要删除的数据的code赋值到变量当中,条件过滤
现在如果执行这样一条语句:delete from Student where code='s101'
则会显示:
如果是:delete from Student where code='s102',或者其他编号以及其他删除,则会走else
事务:
数据库的事务是用来执行批量动作时如果其中一条sql出错,就会停止整个批量动作的执行,并进行事务回滚,将
之前执行完的动作也取消,这样避免在操作数据时出现批量数据不能完全被执行从而造成数据不统一,出现错误和垃圾数据
关键词:begin tran--开始事务,@@error--错误信息(不报错是为0,如果大于0,表示有错误出现),
rollback tran--回滚事务,之前执行的将取消并不再执行,commit tran--提交事务
如下:
有Studet和Class两个表,关联字段(student.code=class.cod)
现在同时向两个表中添加一条数据
insert into class values('三班','s111') insert into Student values('s111','郭德纲','haha','1880-08-08',80)
因第二条出现错误,则会出现一条成功一条失败,因为两个表是关联的,查询时Class表中cod为s111的信息在student表中
就查询不到,从而出现错误和垃圾数据
class表多出一条数据
先手动将这条数据删除,再继续往下看:
这时,咱们就可以用到事务来解决这个问题:
begin tran insert into class values('三班','s111') insert into Student values('s111','郭德纲','haha','1880-08-08',80) if @@error>0 begin rollback tran; end else begin commit tran end
执行结果:
这样执行消息看起来并没有什么变化,但查询这两个表,发现,执行成功的那一条数据并未被插入表中
索引:
创建索引:
唯一的索引 :(关键词unique)
在表格上面创建某个一个唯一的索引。唯一的索引意味着两个行不能拥有相同的索引值。
比如一个成绩表的某一列是考试分数,就无法创建唯一索引,分数有相同的
create unique index 索引名称
on 表名称(列名称)
可以一次给多个列创建索引,以逗号隔开:create unique index 索引名 on 表名(列名,列名)
普通索引:
省略unique关键词,此列中可以有重复的值,上面提到的分数列可以建普通索引
create index 索引名称
on 表名称(列名称)
还可以用ALTER 创建索引: