触发器结果怎么显示在java_如何将查询结果作为条件放在触发器中?

你的位置:

问答吧

-> 数据库

-> 问题详情

如何将查询结果作为条件放在触发器中?

仍然是做一个insert触发器,a表存学生班别姓名,当在表里查入班别,学生,这两个字段信息时,如果查到表中这个学生的名字已存在,就回滚。

我是这样想的,例如插入的是‘王二小’,在触发器里统计a表中姓名为‘王二小’的记录数,如果记录>1,则回滚。

但是代码怎么写呢?

我只写一半,但if语法不对:

create trigger students_insert

on a

for insert

as

select count (*) as counts from (select a.Name from inserted,a where inserted.Name=a.Name)

if counts>1

print '学生名已存在'

rollback transaction

作者: aair

发布时间: 2007-12-28

难道触发器里不能定义变量吗 ?

先定义一个变量, 把查询的结果 赋值给变量, 剩下的就是  T-SQL 编程的事情了。

[ 本帖最后由 magus163 于 2007-12-28 17:43 编辑 ]

作者: magus163

发布时间: 2007-12-28

还有, 我觉得这个用不着触发器, 给字段加个 唯一约束 就行了。

作者: magus163

发布时间: 2007-12-28

把查询结果赋值给变量似乎很麻烦?怎么写呢?

magus163

说的有道理。

我改了一下代码:

create trigger students_insert

on a

for insert

as

if exists(select Name from a group by Name having count(*)>1)

begin

print '学生名已存在'

rollback transaction

end

但是表里还是可以插入两个同名的,直到插入第三个同名的才产生回滚。

作者: aair

发布时间: 2007-12-28

改成

if exists(select Name from a group by Name having count(*)>0)

才是我想要的答案,就是只输入一次姓名,第二次就提示了。

这是怎么回事呢?

作者: aair

发布时间: 2007-12-28

I 服了 You , 用 declare 定义一个变量这么方便的事情你嫌麻烦, 你还是先找本 T-SQL 编成的基础书看看吧。

作者: magus163

发布时间: 2007-12-28

如何将“查询的结果 赋值给变量”,其实我的标题就是这个啊,你只是把我的问题重复了一遍。你叫我去学,我这不是在学么?

我现在面前有一大堆书呢,查了很多。我不用定义变量,嫌麻烦,有原因,等我成为高手之后我告诉你

353999479f5c080f72cb0840ebcd97c1.png

答案我是得到了,就是将>1改为>0,这个问题告一段落。

现在新的问题的,insert触发器触发时,insert into语句是否已把内容插入到a表中?如果是,则是>1但现在是>0才得到正确答案,那么是还未插入?但是我之前用另一种方法

if exists(select a.Name from inserted,a where inserted.Name=a.Name)

却是一条也插不进去的。

谢谢大家理解我这么死脑筋。

作者: aair

发布时间: 2007-12-28

很简单, 有一条符合要求的纪录的时候, 是 =1, >1 就是2条纪录了

作者: magus163

发布时间: 2007-12-28

看来我没有正确理解这句:

if exists(select Name from a group by Name having count(*)>1)

我是这样理解的,如果>1的话,说明在a表里存在2条相同的记录了,那么就回滚。

现在正确的答案是>0,我理解为:如果>0,说明在a表里只有一条记录,回滚。那么回滚后,不是一条记录也没有了么?我无论插什么都是回滚了,什么都插不进去。就是这点不能理解。

作者: aair

发布时间: 2007-12-28

我好象能理解了:

1.王二小,张三,李四 这张表没有重复的记录,所有count=0

2.王二小,张三,张三,李四 这张表有1条重复的记录,count=1也就是>0,要回滚。

3.王二小,张三,张三,张三,李四 这张表有2条重复的记录,就是我做错的count>1.

谢谢,magus163

今天问题暂时解决了,关于还有更好的方法,定义变量什么的,我以后也一定会学到的。

CJJ今晚不用帮我学触发器了,呵呵,谢谢。

作者: aair

发布时间: 2007-12-28

怪了,又想不通了。想把上面的理解删掉

作者: aair

发布时间: 2007-12-28

唯一约束或索引就可以解决你的问题..

if counts>1

print '学生名已存在'

rollback transaction

多行要用

begin....end

否则认为只作用在下一行.

类似

if 1<0

print '1小于0?不对不对,,所以我不显示'

print '你1<0与我一毛钱关系没有,所以我可以显示'

if 1<0

begin

print '1大于0?不对不对,,所以我不显示'

print '我估计是不显示喽'

end

这样的话,一行也不会显示 喽.

作者: hzexe

发布时间: 2007-12-29

换了台机器

if exists(select Name from a group by Name having count(*)>1)

就正确了,说明>1的想法还是对的。

至于为什么原来的机器会这样,还要好好想想。

作者: aair

发布时间: 2008-01-01

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值