数据库:SQL的instead of触发器(1)

废话时最没用的,概念也没用,目的在于为初初初学者提供一个可以理解的东西。

首先了解,在触发器的使用中,两张最重要的表:inserted和deleted。看名字理解意义,他们在你创建表后就有。

然后是instead of ,他将否定掉你写的任何语句对应语句,例如你写的是instead of insert,那么就将你的所有insert语句废除。

这个时候,你像增加的内容就是保存在inserted表中,该表中只有最新的一条记录。

现在让我们来用例子增加知识:

首先我们得有一个表:

create table hospson(
Pno char(15) constraint pri_pno primary key,
Pna char(10) constraint not_pna not null,
Pse char(2) constraint che_pse check(Pse='男' or Pse='女'),
Pph varchar(16) constraint not_pph not null
);

如果你已经学到触发器,那么是能看的懂得。如果看不懂,知道Pno在数据插入中不能为空且不能重复已经有的数据就好。

create trigger ins_hospson
on hospson instead of insert
as
begin
declare @pno1 char(15) 
declare @pno2 char(15)
select @pno1=inserted.Pno from inserted
select @pno2=Pno from hospson 
	where exists (
		select * from inserted); 
if @pno1<>@pno2
begin
	insert into hospson select * from inserted;
end
end

上面得建表也是让你看建触发器时不那么懵。为了看起来不那么复杂,方便理解,所以分开将语句分开写了。

declare 定义变量这个没问题。我们得目的是让插入相同pno时忽略而不是报错。

@pno2得结果:如果hospson表中有插入数据,那么@pno2=@pno1,否则为空。

所以通过两个变量提取到的数据,如果相等,我们就不做操作,如果不相等,我们就将inserted表中的数据插入。

测试:在测试之前我已经插了3条进去。

给两条相同的数据:让后给出结果:数据库:SQL的instead of触发器(1)_第1张图片

 

你可能感兴趣的:(数据库)