原文:在论坛中出现的比较难的sql问题:22(触发器专题3)


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

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

本篇是触发器专题,有很多触发器的问题。

1、sql唯一性约束如何建立?

http://bbs.csdn.net/topics/390697861
比如一张表Table1,
三个字段 ID  A  B
ID为主键,
当B字段为某一特定值value时,A字段值是要唯一约束的,
若B字段为其他值,A不加唯一约束的。。

那达不到我要的约束条件了,
我想要的字段是是这样的(k是B的特定值)
ID  A  B
1   a  b
2   a  b
3   b  k
4   c  k
如果在此基础上再加 
A  B 
b  k
或者c  k 则不能被允许。
我想在数据库中直接约束,看有没有办法,如果没有,则就要代码约束判断了。

我的方法:

    1. --drop table tb
      1. --go
          1. create table tb(ID int, A varchar(10), B varchar(10))
              1. insert into tb
                1. select 1 ,'a', 'b' union all
                  1. select 2 ,'a', 'b' union all
                    1. select 3 ,'b', 'k' union all
                      1. select 4 ,'c', 'k'
                        1. go
                              1. create trigger dbo.trigger_tb_insert
                                1. on dbo.tb
                                  1. for insert
                                    1. as
                                        1. if (select count(*) from inserted i
                                          1. inner join tb
                                            1. on tb.A = i.A and tb.B = i.B
                                              1. where i.B = 'k') > 1
                                                1. rollback
                                                  1. go
                                                        1. --会报错
                                                          1. insert into tb
                                                            1. values(5,'b', 'k')
                                                              1. /*
                                                                1. 消息 3609,级别 16,状态 1,第 1 行
                                                                  1. 事务在触发器中结束。批处理已中止。
                                                                    1. */
                                                                          1. --不会报错
                                                                            1. insert into tb
                                                                              1. values(5,'a', 'b')
                                                                                1. /*
                                                                                  1. (1 行受影响)
                                                                                    1. */
                                                                                  1.  

                                                                                  2、如何实现一张表的某个字段为另一张表的某字段的计算值?

                                                                                  有一张表AA 有字段 a b c

                                                                                  另一张表BB 字段 aa bb cc

                                                                                  如何实现AA表的字段b(为整数型)中的数据 是BB表中的cc字段(为整数型)所有数据记录的总和(sum)!

                                                                                  要求做到BB表数据记录增加的同时AA表中字段b的记录值自动同步更新。

                                                                                  我的建议:

                                                                                  1. 对的,触发器能实现你的需求,另外,索引能加快速度。
                                                                                  2. 因为这种同步的需求,首先,不是跨越服务器的,一般跨越服务器的,可以考虑用数据库同步(异步)、镜像(同步)、日志传送(异步)等技术。
                                                                                  3. 而你现在是在同一台服务器上,要同步2个表的数据,所以用触发器是最合适的,而且触发器本身的特性是,在同一个事务中,只要你的数据插入成功,那么另一个表的数据,也就是同步成功了,同样的,如果插入失败,报错,那么另一个表的数据也不会同步成功。
                                                                                  4. 再有,就是效率的问题,如果每次都sum求和,而你的表里是上亿的数据,这个sum肯定是非常耗时的,所以这里采用的是,你插入1条数据,那么只要把这个插入的数据,通过update set c = c + 插入的值
                                                                                  5. 那么自然就加快了速度,而且不会出现并发的问题。
                                                                                  6. 如果还想进一步加快速度,那么可以考虑,给A表建立索引,因为a表肯定记录也不会少,而且肯定是通过where条件来定义某一条记录,然后update ,这个时候通过索引,就能更快的找到这条记录,然后update

                                                                                  4、如何实现一张表的某个字段为另一张表的某字段的计算值?

                                                                                  有一张表AA 有字段 a b c

                                                                                  另一张表BB 字段 aa bb cc

                                                                                  如何实现AA表的字段b(为整数型)中的数据 是BB表中的cc字段(为整数型)所有数据记录的总和(sum)!

                                                                                  要求做到BB表数据记录增加的同时AA表中字段b的记录值自动同步更新。

                                                                                  我的建议:

                                                                                  1. 对的,触发器能实现你的需求,另外,索引能加快速度。
                                                                                  2. 因为这种同步的需求,首先,不是跨越服务器的,一般跨越服务器的,可以考虑用数据库同步(异步)、镜像(同步)、日志传送(异步)等技术。
                                                                                  3. 而你现在是在同一台服务器上,要同步2个表的数据,所以用触发器是最合适的,而且触发器本身的特性是,在同一个事务中,只要你的数据插入成功,那么另一个表的数据,也就是同步成功了,同样的,如果插入失败,报错,那么另一个表的数据也不会同步成功。
                                                                                  4. 再有,就是效率的问题,如果每次都sum求和,而你的表里是上亿的数据,这个sum肯定是非常耗时的,所以这里采用的是,你插入1条数据,那么只要把这个插入的数据,通过update set c = c + 插入的值
                                                                                  5. 那么自然就加快了速度,而且不会出现并发的问题。
                                                                                  6. 如果还想进一步加快速度,那么可以考虑,给A表建立索引,因为a表肯定记录也不会少,而且肯定是通过where条件来定义某一条记录,然后update ,这个时候通过索引,就能更快的找到这条记录,然后update

                                                                                  发布了416 篇原创文章 · 获赞 135 · 访问量 94万+

                                                                                  在论坛中出现的比较难的sql问题:22(触发器专题3)的更多相关文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                                                                                  8. 在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题)

                                                                                    原文:在论坛中出现的比较难的sql问题:38(字符拆分 字符串检索问题) 最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了. 所以,觉得 ...

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

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

                                                                                  10. 在论坛中出现的比较难的sql问题:36(动态行转列 解析json格式字符串)

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

                                                                                  随机推荐

                                                                                  1. futex的设计与实现

                                                                                    介绍 futex(快速用户空间互斥)是Linux的一个基础组件,可以用来构建各种更高级别的同步机制,比如锁或者信号量等等,POSIX信号量就是基于futex构建的.大多数时候编写应用程序并不需要直接使 ...

                                                                                  2. Spring AOP Log

                                                                                    spring aop action中验证用户登录状态 - CASER_HDMI的博客 - CSDN博客https://blog.csdn.net/CASER_HDMI/article/details/ ...

                                                                                  3. 使用注解@Slf4j简化Logger的初始化

                                                                                    一.是不是厌倦了 private final static Logger logger = LoggerFactory.getLogger(Application.class); 的拷贝和修改? 二. ...

                                                                                  4. openresty开发系列28--openresty中操作mysql

                                                                                    openresty开发系列28--openresty中操作mysql Mysql客户端   应用中最常使用的就是数据库了,尤其mysql数据库,那openresty lua如何操作mysql呢?   ...

                                                                                  5. pytorch torch.nn 实现上采样——nn.Upsample

                                                                                    Vision layers 1)Upsample CLASS torch.nn.Upsample(size=None, scale_factor=None, mode='nearest', align ...

                                                                                  6. linux下nacos的1.1.3版本集群部署

                                                                                    windows单机版参见0.9.0.RELEASE版本的spring cloud alibaba nacos实例 ,linux集群版我们还是用上次下载的nacos压缩包,通过rz -y上传到wlf用户 ...

                                                                                  7. Qt编写自定义控件67-通用无边框

                                                                                    一.前言 在之前的一篇文章中写过一个通用的移动控件,作用就是用来传入任意的widget控件,可以在父类容器中自由移动.本篇文章要写的是一个通用的无边框类,确切的说这不叫控件应该叫组件才对,控件是要看得 ...

                                                                                  8. Android Butterknife使用方法总结 IOC框架

                                                                                    前言: ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤.是大神J ...

                                                                                  9. Swift4.0复习函数

                                                                                    1.函数的定义与调用: 一个函数定义的基本语法如以下代码所示: func function_name (param1: Int, param2: Float, param3: Double) -> ...

                                                                                  10. 原生JavaScript判断浏览器对CSS属性是否支持

                                                                                    /*判断浏览器是否支持某个css属性*/ function SupportCss(attrName){ var i=0, arr = SupportCss.opt.aBrowser, eleStyle ...