最近很懒,也有忙的原因~~一些东西懒得发上来了·~~还是要写上来才可以,不然学到的东西以后我就忘记了
以下只保证在MSSQL下顺利执行~~可能在MySql不太一样。
最近在做作业的时候想用用数据库的触发器写写~发觉还不是一般的烦呀~~变量多了就觉得有点烦了~~不过语言还是挺容易上手的~~
插播一句:ID自增的写法

create table ritem(id int IDENTITY(1,1)
);

触发器的基本写法
[code=sql]
create trigger 触发器名 on 数据表名 for (insert|update|delete)
...


最近很懒,也有忙的原因~~一些东西懒得发上来了·~~还是要写上来才可以,不然学到的东西以后我就忘记了
以下只保证在MSSQL下顺利执行~~可能在MySql不太一样。
最近在做作业的时候想用用数据库的触发器写写~发觉还不是一般的烦呀~~变量多了就觉得有点烦了~~不过语言还是挺容易上手的~~
插播一句:ID自增的写法

create table ritem(id int IDENTITY(1,1)
);

触发器的基本写法

create trigger 触发器名 on 数据表名 for (insert|update|delete)
as
begin在这里写代码
end

定义变量,并赋值

create trigger t_insert_ritem on ritem for insert
as
begindeclare @id intselect @id=id from inserted-- 从插入的数据获得ID的值,还有一个deleted-- inserted表示新的数据,deleted表示旧的数据(自己理解的,不知道对不对?)set @id = @id - 1-- 另一种赋值PRINT @id-- 可以把值打印出来,在查询分析器结果可以看到raiserror('抛出错误 id的值为:%d',16,1,@id)-- 也可以这样输出if (@id<0) beginrollback transaction-- 回滚事务endif exists(select * from ritem where id=@id) begin-- 还可以用exists来判断是否为空end
endCREATE TRIGGER TRIGGER_Update ON ritem
FOR UPDATE
ASif Update(UserName)begin-- 判断UserName有没有更新end
1.插入操作(Insert)
  Inserted表有数据,Deleted表无数据
  2.删除操作(Delete)
  Inserted表无数据,Deleted表有数据
  3.更新操作(Update)
  Inserted表有数据(新数据),Deleted表有数据(旧数据)

当你更新一个数据想要把相关联的所有数据都更新的时候就要用游标(CURSOR)鸟~~MSSQL的遍历

declare @id int, @rid intdeclare cur_tmp CURSOR FOR select id,rid from ritemOPEN cur_tmpFETCH NEXT FROM cur_tmp INTO @id,@rid -- 这里是取到select的值WHILE @@FETCH_STATUS = 0BEGIN-- 在这中间加入循环FETCH NEXT FROM cur_tmp INTO @id,@ridENDCLOSE cur_tmpDEALLOCATE cur_tmp -- 释放游标