最近很懒,也有忙的原因一些东西懒得发上来了·还是要写上来才可以,不然学到的东西以后我就忘记了
以下只保证在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 
begin
	declare @id int
	select @id=id from inserted
	-- 从插入的数据获得ID的值,还有一个deleted
	-- inserted表示新的数据,deleted表示旧的数据(自己理解的,不知道对不对?)

	set @id = @id - 1
	-- 另一种赋值

	PRINT @id
	-- 可以把值打印出来,在查询分析器结果可以看到
	raiserror('抛出错误 id的值为:%d',16,1,@id) 
	-- 也可以这样输出

	if (@id<0) begin
		rollback transaction
		-- 回滚事务
	end

	if exists(select * from ritem where id=@id) begin
		-- 还可以用exists来判断是否为空
	end
end

CREATE TRIGGER TRIGGER_Update ON ritem
FOR UPDATE
AS
    if Update(UserName)
    begin
	-- 判断UserName有没有更新
    end
>   1.插入操作(Insert)
  Inserted表有数据,Deleted表无数据
  2.删除操作(Delete)
  Inserted表无数据,Deleted表有数据
  3.更新操作(Update)
  Inserted表有数据(新数据),Deleted表有数据(旧数据)>

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

declare @id int, @rid int
	declare cur_tmp CURSOR FOR select id,rid from ritem
	OPEN cur_tmp
	FETCH NEXT FROM cur_tmp INTO @id,@rid -- 这里是取到select的值
	WHILE @@FETCH_STATUS = 0
	BEGIN
	
	-- 在这中间加入循环

	FETCH NEXT FROM cur_tmp INTO @id,@rid
	END
	CLOSE cur_tmp
	DEALLOCATE cur_tmp -- 释放游标