为什么建的触发器不管用啊

wslkn1 2011-05-07 11:08:00
当插入值的时候不论原表中有没有此数据都插不进去
--在sql server 2000中运行的
create table lkn
(
bookid int,
auther char(20),
bookname char(20),
bdate char(20),
state char(10)
)
if exists(select name from sysobjects where name='l')
drop trigger l --检查数据库中是否存在此名字的触发器
create trigger l
on lkn
for insert
as
begin
declare @book int
select @book=bookid from inserted
if exists(select bookid from lkn where bookid=@book)
print '已存在此书号,输入错误!!!'
rollback
end
...全文
151 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
wslkn1 2011-05-08
  • 打赏
  • 举报
回复
恩,谢谢了啊
百年树人 2011-05-08
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 wslkn1 的回复:]
引用 14 楼 josy 的回复:
引用 13 楼 wslkn1 的回复:
insert lkn select * from inserted和平常用的插入语句insert into表名 values有什么区别啊


前者是插入已存在的表,后者插入的表名必须不存在才可以成功执行(后者插入时自动创建表)

不是吧,insert into 表名 values(属性值,属性值)也可以插入到……
[/Quote]

不好意思,看错,以为是 select * into 表名 from tb

insert into 表名 values(属性值,属性值) 一条语句只能插入一条记录
insert into 表名 select * from tb 可以一次插入多条记录
wslkn1 2011-05-08
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 wslkn1 的回复:]
引用 14 楼 josy 的回复:
引用 13 楼 wslkn1 的回复:
insert lkn select * from inserted和平常用的插入语句insert into表名 values有什么区别啊


前者是插入已存在的表,后者插入的表名必须不存在才可以成功执行(后者插入时自动创建表)

不是吧,insert into 表名 values(属性值,属性值)也可以插入到……
[/Quote]
是啊,我平常用语句插入数据时都是用这种方法插的啊,就像这个代码的插入语句就用
insert into lkn
values(25,'dsf','dsafa','20010204','未借')
wslkn1 2011-05-08
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 josy 的回复:]
引用 13 楼 wslkn1 的回复:
insert lkn select * from inserted和平常用的插入语句insert into表名 values有什么区别啊


前者是插入已存在的表,后者插入的表名必须不存在才可以成功执行(后者插入时自动创建表)
[/Quote]
不是吧,insert into 表名 values(属性值,属性值)也可以插入到已存在的表中啊
百年树人 2011-05-08
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wslkn1 的回复:]
insert lkn select * from inserted和平常用的插入语句insert into表名 values有什么区别啊
[/Quote]

前者是插入已存在的表,后者插入的表名必须不存在才可以成功执行(后者插入时自动创建表)
wslkn1 2011-05-08
  • 打赏
  • 举报
回复
insert lkn select * from inserted和平常用的插入语句insert into表名 values有什么区别啊
andy_liucj 2011-05-08
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 wslkn1 的回复:]
哦,这是重点啊,还没见过instead of,非常感谢你,让我扩充了不少知识
在if exists(select 1 from lkn a,inserted i where a.bookid=i.bookid)里面,select 1的l是干什么用的啊,l并不是表里的属性啊?
[/Quote]select 1没有特殊含义,select 任何东西都可以,
这只是用来判断有没有的
百年树人 2011-05-08
  • 打赏
  • 举报
回复
if exists()里面是一个真与假的条件,并不返回结果集,所以这里写什么都不重要
有满足条件的记录时,条件为真,否则为假
wslkn1 2011-05-08
  • 打赏
  • 举报
回复
哦,这是重点啊,还没见过instead of,非常感谢你,让我扩充了不少知识
在if exists(select 1 from lkn a,inserted i where a.bookid=i.bookid)里面,select 1的l是干什么用的啊,l并不是表里的属性啊?
xiongshao1943 2011-05-08
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 wslkn1 的回复:]
insert lkn select * from inserted和平常用的插入语句insert into表名 values有什么区别啊
[/Quote]
从效果上没什么区别
只不过insert lkn select * from inserted可以在两个表结构完全一样的表中导数据,不用写values()里面的一大串,省时省力
百年树人 2011-05-07
  • 打赏
  • 举报
回复
主要的问题在
for insert 和 instead of insert 的区别

用for的话是插入以后再判断(插入以后当然就存在了),用instead of是在插入前判断
wslkn1 2011-05-07
  • 打赏
  • 举报
回复
这个结果是可以,能不能帮忙分析一下我原来的那个代码为什么不行啊,我看着挺对的,
把if exists(select bookid from lkn where bookid=@book)改为if exists(select bookid from lkn where bookid=@book)就可以使bookid=1的元组插不进去,这是为什么啊?谢谢了啊
百年树人 2011-05-07
  • 打赏
  • 举报
回复
要用instead of,试试以下代码

if exists(select name from sysobjects where name='l')
drop trigger l --检查数据库中是否存在此名字的触发器
create trigger l
on lkn
instead of insert
as
begin
if exists(select 1 from lkn a,inserted i where a.bookid=i.bookid)
begin
RAISERROR('已存在此书号,输入错误!!!',16,1)
rollback
end
else
begin
insert lkn select * from inserted
end
end
go
wslkn1 2011-05-07
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 josy 的回复:]
引用 4 楼 wslkn1 的回复:
我怎么执行后还不行啊,不用错误挂起行吗,就用打印的


打印信息可以替换回你原来的,这种写法,如果插入一批记录,只要有一条存在所有都不会插入
[/Quote]

我就插入了一条记录,是表中原来没有的,运行后结果如下(还是不正确啊,麻烦再解答一下吧,我用的是sql server 2000):
(所影响的行数为 1 行)


(所影响的行数为 1 行)


(所影响的行数为 7 行)

服务器: 消息 50000,级别 16,状态 1,过程 l,行 8
已存在此书号,输入错误!!!
百年树人 2011-05-07
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wslkn1 的回复:]
我怎么执行后还不行啊,不用错误挂起行吗,就用打印的
[/Quote]

打印信息可以替换回你原来的,这种写法,如果插入一批记录,只要有一条存在所有都不会插入
wslkn1 2011-05-07
  • 打赏
  • 举报
回复
我怎么执行后还不行啊,不用错误挂起行吗,就用打印的
百年树人 2011-05-07
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 josy 的回复:]
SQL code
if exists(select name from sysobjects where name='l')
drop trigger l --检查数据库中是否存在此名字的触发器
create trigger l
on lkn
for insert
as
begin
if exists(select 1 from lkn a,inserted i where a.b……
[/Quote]
加个begin end ,否则是否满足条件rollback都会执行
if exists(select name from sysobjects where name='l')
drop trigger l --检查数据库中是否存在此名字的触发器
create trigger l
on lkn
for insert
as
begin
if exists(select 1 from lkn a,inserted i where a.bookid=i.bookid)
begin
RAISERROR('已存在此书号,输入错误!!!',16,1)
rollback
end
end
go
百年树人 2011-05-07
  • 打赏
  • 举报
回复
if exists(select name from sysobjects where name='l')
drop trigger l --检查数据库中是否存在此名字的触发器
create trigger l
on lkn
for insert
as
begin
if exists(select 1 from lkn a,inserted i where a.bookid=i.bookid)
begin
RAISERROR('已存在此书号,输入错误!!!,16,1)
rollback
end
end
go

22,207

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧