当插入值的时候不论原表中有没有此数据都插不进去
--在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

解决方案 »

  1.   

    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
      

  2.   

    加个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
      

  3.   


    不,懂;帮,顶;学,习;赚,分。
    虽然这么回贴可能会被删除。
    谁他妈的删除了就是个王八蛋。
    强烈抗议CSDN这种即当婊子又想立贞洁牌坊的恶劣行为!!!
    有本事,就封杀我!!!理由在这里:
    他妈的一帮管理员有神经病啊???
    http://topic.csdn.net/u/20110422/10/1a381057-7a7b-41d9-8969-ad1f5b77f24a.html?38665
      

  4.   


    我就插入了一条记录,是表中原来没有的,运行后结果如下(还是不正确啊,麻烦再解答一下吧,我用的是sql server 2000):
    (所影响的行数为 1 行)
    (所影响的行数为 1 行)
    (所影响的行数为 7 行)服务器: 消息 50000,级别 16,状态 1,过程 l,行 8
    已存在此书号,输入错误!!!
      

  5.   

    要用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
      

  6.   

    这个结果是可以,能不能帮忙分析一下我原来的那个代码为什么不行啊,我看着挺对的,
    把if exists(select bookid from lkn where bookid=@book)改为if exists(select bookid from lkn where bookid=@book)就可以使bookid=1的元组插不进去,这是为什么啊?谢谢了啊
      

  7.   

    主要的问题在
    for insert 和  instead of insert 的区别用for的话是插入以后再判断(插入以后当然就存在了),用instead of是在插入前判断
      

  8.   

    哦,这是重点啊,还没见过instead of,非常感谢你,让我扩充了不少知识
    在if exists(select 1 from lkn a,inserted i where a.bookid=i.bookid)里面,select 1的l是干什么用的啊,l并不是表里的属性啊?
      

  9.   

    if exists()里面是一个真与假的条件,并不返回结果集,所以这里写什么都不重要
    有满足条件的记录时,条件为真,否则为假
      

  10.   

    select 1没有特殊含义,select 任何东西都可以,
    这只是用来判断有没有的
      

  11.   

    insert lkn select * from inserted和平常用的插入语句insert into表名 values有什么区别啊
      

  12.   

    不是吧,insert into 表名 values(属性值,属性值)也可以插入到已存在的表中啊
      

  13.   

    是啊,我平常用语句插入数据时都是用这种方法插的啊,就像这个代码的插入语句就用
    insert into lkn
    values(25,'dsf','dsafa','20010204','未借')
      

  14.   


    不好意思,看错,以为是 select * into 表名 from tbinsert into 表名 values(属性值,属性值) 一条语句只能插入一条记录
    insert into 表名 select * from tb 可以一次插入多条记录
      

  15.   

    从效果上没什么区别
    只不过insert lkn select * from inserted可以在两个表结构完全一样的表中导数据,不用写values()里面的一大串,省时省力