现在数据库中有两张表,一张正式员工表,一张离职员工表。
比如赵二现在要离职,要从员工表里面删除,但是离职表里面要添加上赵二,如果你这样写代码:

获得赵二ID
建立删除赵二的SQL语句
链接数据库进行删除
建立添加赵二的SQL语句
链接数据库进行添加

好,任务简单也还可以,但是现在又有一张部门表,部门的主键作为员工表中的外键存在,现在公司要裁掉一整个部门,你该怎么办?
难 道 这 样 ?

获得部门ID
查询部门所有员工ID
建立删除员工的sql语句
链接数据库进行删除
建立添加离职员工的sql语句
链接数据库进行添加
建立删除部门的sql语句
链接数据库进行删除
........

看了上面的过程,相信大家也都很头疼,不仅代码啰嗦,也显得很没有技术水平。那么有没有一种方法,我只需要输入删除部门的语句,其他和这个部门相关联的表的操作也自动执行呢?这个时候触发器就出场了。

数据库中提供了两种主要机制来强制业务规则和数据完整性:约束和触发器触发器是一种特殊类型的存储过程,它在指定的表中的数据发生变化时自动生效(触发器通过事件进行触发而被执行,而存储过程可以通过存储过程名字而被直接调用)。

唤醒调用触发器以响应 INSERT、UPDATE 或 DELETE 语句。将触发器和触发它的语句作为可在触发器内回滚的单个事务对待。如果检测到严重错误(例如,磁盘空间不足),则整个事务即自动回滚(回滚到触发之前的状态)。

斜体样式<扩充约束>:

约束是自动保持数据库完整性的一种方法,通过限制字段中的数据、记录中的数据和表之间的数据来保证数据的完整性。

斜体样式<sql中默认的五大约束>:

	1、主键约束(Primay Key Coustraint) 唯一性,非空性
	2、唯一约束 (Unique Counstraint)唯一性,可以空,但只能有一个
	3、检查约束 (Check Counstraint)对该列数据的范围、格式的限制(如:年龄、性别等)
	4、默认约束 (Default Counstraint)该数据的默认值
	5、外键约束 (Foreign Key Counstraint)需要建立两表间的关系并引用主表的列

所以说,我们上面举的栗子中,就有主外键的约束,来保证数据的完整性。当约束所支持的功能无法满足应用程序的功能要求时,也就是说,我只想执行删除部门的操作,因为主外键约束,只进行删除部门操作是不可行的(被约束了),那么这个时候触发器极为有用。

上面我们有说,当对某一表进行诸如Update、Insert、Delete这些操作时,Sql就会自动执行触发器所定义的sql语句。

根据触发器触发方式的不同,我们可以分为两种情况:

  • after触发器(sql语句执行之后触发)

只有执行某一操作(Insert Update Delete) 之后,触发器才被触发,且只能在表上定义。可以为针对表的同一操作定义多个触发器。对于AFTER触发器,可以定义哪一个触发器被最先触发,哪一个被最后触发,通常使用系统过程sp_settriggerorder 来完成此任务。

  • Instead of触发器(sql语句执行之前触发)

并不执行其所定义的操作(Insert、 Update、 Delete),而仅是执行触发器本身。既可在表上定义INSTEAD OF触发器,也可以在视图上定义INSTEAD OF 触发器,但对同一操作只能定义一个INSTEAD OF 触发器。

下面我们就针对 Instead of触发器来举个例子:

在新闻发布系统中,我们需要一个新闻类别表category,一个新闻表news,一个评论表comments。
新闻类别表中的主键作为新闻表中的外键存在,新闻表总的主键作为评论表中的外键而存在。

那么现在需要删除“早间新闻”这一个新闻类别,由于外键的约束,我们是不能直接删除的,也就是说,在执行删除“早间新闻”这一个数据时,必须先将它所对应的新闻评论删除,再将它所对应的新闻删除。

解决方案就是应用触发器(当对表进行删除操作时自动执行的存储过程)

新闻类别表:
在这里插入图片描述

要执行的sql语句:

delete from category where id=12

触发器内容:

-- =============================================
-- Author:	zhy	<Author,,Name>
-- Create date: 2018年12月23日 08点10分<Create Date,,>
-- Description:	删除类别触发器<Description,,>
-- =============================================
ALTER TRIGGER [dbo].[trigCategoryDelete]
   ON  [dbo].[category]
  instead of DELETE
BEGIN
	declare @Id int
	select @Id  =id from deleted 
	--删除评论
	delete comments where newsId=(select id from news where caId=@Id )
	--删除新闻
	delete news where caId =@Id  
	--删除类别
	delete category where id =@Id  

以上就是对触发器的一些简单认识,具体怎样创建和使用大家可以在去问问度娘,在这里推荐一篇博客sql触发器

喜欢的可以点个赞呦?!

在mysql数据库中,有时会用到外键约束FOREIGN KEY。这些外键约束也可以使用触发器TRIGGER来实现。当然,外键约束触发器都是不提倡使用的。因为外键约束触发器容易给数据库服务器增加额外的负担,造成性能下降。甚至可能造成频发的锁等待或者死锁。 下边举例说明如何用触发器实现外键约束,包括外键级联更新和删除。 假设有students和scores两张表,并且存在外键约束关系: DROP TABLE IF EXISTS `students`; CREATE TABLE `students`
键值约束主要有以上4种,其中Unique,外键,索引都可以在关系中存在多个,但primary key只能唯一存在。 另外,在处理外键约束的插入、删除、更新等操作时DBMS主要提供了三种方法: 1.引用关系的删除... CREATE OR REPLACE FUNCTION identifyIdfunc() RETURNS TRIGGER AS $BODY$ BEGIN IF (CASE WHEN NEW.t_role_id =2 THEN NEW.username is null else 1=2 END) THEN INSERT INTO test.t_user(t_user_id)VALUES ('erro... alter table tbname add constraint pk_name primary key(column1,column2) --添加非聚集主键 alter table tbname add constraint pk_name primary key NONCLUSTERED(column1,column2) --删除主键 alter table tbname drop constraint pk_name 外键(foreign key)增删 --添加外键 #关联表和引用完整性 #关系数据库存储分解为多个表的数据,每个表存储相应的数据 #利用键来建立从一个表到另一个表的引用(由此产生了术语引用完整性referential integrity) 正确地进行关系数据库设计,需要一种方法保证只在表中插入合法数据 虽然可以在插入新行时进行检查(在另一个表上执行SELECT,以保证所有值合法并存在),但最好不好这样,原
触发器表事件有关的特殊存储过程。它不能直接被执行,必须为表上的增、删、改事件所触发。外键要比触发器更快,但是我们经常会遇见外键约束的问题,触发器能解决外键不能处理的复杂关系。下面是一个实践的例子:     在牛腩发布系统中,三个表(新闻类别、新闻、评论)之间的关系是一对多的关系,每个新闻类别可以有多条新闻,每条新闻可以有多条评论,主键为相应的id号,关系图如下: