原文:在论坛中出现的比较难的sql问题:9(触发器专题 插入数据自动更新表数据)


最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。

所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。

触发器问题,插入数据时,自动更新表的数据

http://bbs.csdn.net/topics/390634682

表1有字段1,字段2

插入数据4行

字段1   字段2

101

102

101

102

我想通过触发器,直接更新字段2,实现

字段1   字段2

101     101+1

102     102+1

101     101+2

102     102+2

这样的功能,请各位帮忙看看,如何来实现,

在插入数据的时候,实现更新。

方法1,适合2005及以后的版本:


  1. --drop table tb
  2. create table tb
  3. (字段1 int, 字段2 int, 字段3 int, 字段4 int)
  4. drop trigger trigger_tb
  5. create trigger dbo.trigger_tb
  6. on tb
  7. for insert
  8. as
  9. ;with t
  10. as
  11. (
  12. select tb.*,
  13. row_number() over(partition by tb.字段1 order by tb.字段4) as rownum
  14. from tb
  15. inner join inserted i
  16. on tb.字段1 = i.字段1
  17. and tb.字段3 = i.字段3
  18. and tb.字段4 = i.字段4
  19. )
  20. update t
  21. set 字段2 = 字段1+rownum
  22. go
  23. insert into tb
  24. select 101,null, 1, 1
  25. union all select 102,null, 1, 2
  26. union all select 101,null, 1, 3
  27. union all select 102,null, 1, 4
  28. --查询
  29. select *
  30. from tb
  31. /*
  32. 字段1 字段2 字段3 字段4
  33. 101 102 1 1
  34. 102 103 1 2
  35. 101 103 1 3
  36. 102 104 1 4
  37. */

方法2,适合2000:


  1. --drop table tb
  2. create table tb
  3. (字段1 int, 字段2 int, 字段3 int, 字段4 int)
  4. --drop trigger trigger_tb
  5. create trigger dbo.trigger_tb
  6. on tb
  7. for insert
  8. as
  9. update tb
  10. set 字段2 = t1.字段1 + (select count(*) from tb t2
  11. where t2.字段1 = t1.字段1
  12. and t2.字段4 <= t1.字段4)
  13. from tb t1
  14. inner join inserted i
  15. on t1.字段1 = i.字段1
  16. and t1.字段3 = i.字段3
  17. and t1.字段4 = i.字段4
  18. go
  19. insert into tb
  20. select 101,null, 1, 1
  21. union all select 102,null, 1, 2
  22. union all select 101,null, 1, 3
  23. union all select 102,null, 1, 4
  24. --查询
  25. select *
  26. from tb
  27. /*
  28. 字段1 字段2 字段3 字段4
  29. 101 102 1 1
  30. 102 103 1 2
  31. 101 103 1 3
  32. 102 104 1 4
  33. */

另一个例子,SQL Server2000触发器实现一个表的更新:


  1. --drop table mocta
  2. create table purtb
  3. (请购单号 varchar(10),参考单号 varchar(10),备注 varchar(50))
  4. create table mocta
  5. (工单单号 varchar(10),订单单号 varchar(10))
  6. insert into purtb
  7. select '101','201','301' union all
  8. select '102','302','302' union all
  9. select '103','备料','备料'
  10. insert into mocta
  11. select '201','301' union all
  12. select '202','302'
  13. go
  14. --drop trigger trigger_purtb_insert
  15. create trigger dbo.trigger_purtb_insert
  16. on purtb
  17. for insert
  18. as
  19. update purtb
  20. set 备注 = isnull((select t1.订单单号
  21. from mocta t1
  22. where i.参考单号 = t1.工单单号),
  23. i.参考单号)
  24. from inserted i
  25. where purtb.请购单号 = i.请购单号 and
  26. purtb.参考单号 = i.参考单号
  27. go
  28. insert into purtb(请购单号,参考单号)
  29. select '104','201'
  30. union all select '105','xxx'
  31. --查询
  32. select *
  33. from purtb
  34. /*
  35. 请购单号 参考单号 备注
  36. 101 201 301
  37. 102 302 301
  38. 103 备料 备料
  39. 104 201 301
  40. 105 xxx xxx
  41. */
发布了416 篇原创文章 · 获赞 135 · 访问量 94万+

在论坛中出现的比较难的sql问题:9(触发器专题 插入数据自动更新表数据)的更多相关文章

  1. 在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名)

    原文:在论坛中出现的比较难的sql问题:37(动态行转列 某一行数据转为列名) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  2. 在论坛中出现的比较难的sql问题:5(row_number函数 分页、随机返回数据)

    原文:在论坛中出现的比较难的sql问题:5(row_number函数 分页.随机返回数据) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路. 1.在inner join后, ...

  3. 在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题)

    原文:在论坛中出现的比较难的sql问题:46(日期条件出现的奇怪问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  4. 在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时、分钟计算问题)

    原文:在论坛中出现的比较难的sql问题:45(用户在线登陆时间的小时.分钟计算问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. ...

  5. 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)

    原文:在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决 ...

  6. 在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列)

    原文:在论坛中出现的比较难的sql问题:42(动态行转列 考勤时间动态列) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  7. 在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字)

    原文:在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字) 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路.

  8. 在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存)

    原文:在论坛中出现的比较难的sql问题:40(子查询 销售和历史库存) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得有 ...

  9. 在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题)

    原文:在论坛中出现的比较难的sql问题:39(动态行转列 动态日期列问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉 ...

随机推荐

  1. idhttp访问DATASNAP有密码验证的中间件

    idhttp访问DATASNAP有密码验证的中间件 用TIDHttp访问DataSnap Rest服务器,在服务器采用了用户验证的情况下,客户端需要提交密码,否则不能正常连接. procedure T ...

  2. golang基于当前1.9版本进行源码编译升级到1.10

    一.起因 golang出了最新的1.10版本,而刚出的vgo也是需要基于该最新版本的.为了测试vgo,因此需要将我的v1.9升级到v1.10版本. 安装过golang的同学都知道,golang常用的有 ...

  3. 算法习题---4-3黑白棋(UVa220)

    一:题目 系统提示当前旗手W/B(白/黑)下子,例如W下子,那么W下的位置必须是夹住黑色棋子的位置才可以. 夹住方式:横向.竖向.斜向 注意落子后将夹住的黑棋吞噬变为白棋 (一)题目详解 .棋盘以数组 ...

  4. 第一个php文件运行

    运行会发现报错,解决参考:写的很详细 http://blog.csdn.net/meegomeego/article/details/36020553

  5. Spring Cloud(7.1):安装Kafka和Redis

    Kafka安装 (1)从官方(http://kafka.apache.org/downloads)下载安装包.kafka安装包和一般安装包的命名方式不一样,我们看一个kafka包命名:kafka_2. ...

  6. Docker 容器的资源限制 cgroup(九)

    目录 一.cgroup简介 二.CPU资源配额控制 1.CPU份额控制 2.CPU周期控制 3.CPU core控制 4.CPU配额控制参数的混合使用 二.对内存的限额 三.对 Block IO 的限 ...

  7. 心の壁 From EOE:Air / 真心为你

    https://www.bilibili.com/bangumi/media/md10272/ 真嗣:我问你. 凌波:什么? 真嗣:梦到底是什么呢? 凌波:梦? 真嗣:我不太明白什么是现实. 凌波:你 ...

  8. python 全栈开发之旅

    目录 python 基础语法 python 数据类型(未完成) python 内置函数(未完成) python 常用标准库(未完成) python 类(未完成) python 进程.线程.协程(未完成 ...

  9. Graphics2D画快递电子面单图片并且打印

    画图类 package com.example.testpdf; import org.krysalis.barcode4j.impl.code128.Code128Bean; import org. ...

  10. 最新 世纪龙java校招面经 (含整理过的面试题大全)

    从6月到10月,经过4个月努力和坚持,自己有幸拿到了网易雷火.京东.去哪儿.世纪龙等10家互联网公司的校招Offer,因为某些自身原因最终选择了世纪龙.6.7月主要是做系统复习.项目复盘.LeetCo ...