博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
在论坛中出现的比较难的sql问题:22(触发器专题3)
阅读量:5054 次
发布时间:2019-06-12

本文共 2172 字,大约阅读时间需要 7 分钟。

最近,在论坛中,遇到了不少比较难的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 则不能被允许。
我想在数据库中直接约束,看有没有办法,如果没有,则就要代码约束判断了。

我的方法:

 

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

 

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

有一张表AA 有字段 a b c

另一张表BB 字段 aa bb cc
如何实现AA表的字段b(为整数型)中的数据 是BB表中的cc字段(为整数型)所有数据记录的总和(sum)!
要求做到BB表数据记录增加的同时AA表中字段b的记录值自动同步更新。

我的建议:

 

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

 

 

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

有一张表AA 有字段 a b c

另一张表BB 字段 aa bb cc
如何实现AA表的字段b(为整数型)中的数据 是BB表中的cc字段(为整数型)所有数据记录的总和(sum)!
要求做到BB表数据记录增加的同时AA表中字段b的记录值自动同步更新。

我的建议:

 

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

 

转载于:https://www.cnblogs.com/momogua/p/8304526.html

你可能感兴趣的文章
java string(转)
查看>>
__all__有趣的属性
查看>>
BZOJ 5180 [Baltic2016]Cities(斯坦纳树)
查看>>
写博客
查看>>
利用循环播放dataurl的视频来防止锁屏:NoSleep.js
查看>>
品味第一杯瓜哇咖啡
查看>>
第十四周总结Access
查看>>
Java开发笔记(一百零二)信号量的请求与释放
查看>>
gridview DataFormatString 属性设置须知
查看>>
springboot项目部署Linux(十一)
查看>>
出差(七)学习
查看>>
python3 生成器与迭代器
查看>>
C++primer 13.2.2节练习
查看>>
IE iframe background
查看>>
robot framework使用小结(四)
查看>>
APUE 3.10 文件共享
查看>>
在云主机上架设GO和dotweb
查看>>
android 打包 apk keystore
查看>>
oracle 表空间 数据文件 表的关系
查看>>
java编写提升性能的代码
查看>>