none
求助:触发器的使用 RRS feed

  • 问题

  • 这里我有两张表,一张是cat_tb表(大类别表),另一张是小类别表(subCat_tb)

    我想修改\删除\大类别表cat_tb的时候,小类别表也随着改变

    create table cat_tb(
       cat_id int primary key,
       cat_name varchar(20)
    )
    select * from cat_tb
    insert into cat_tb(cat_id,cat_name) values(2001,'电子产品')
    insert into cat_tb values(2000,'美容产品')


    create table subCat_tb(
       subCat_id int primary key,
       subCat_name varchar(20),
       cat_id int foreign key(cat_id) references cat_tb
    )

    select * from subCat_tb
    insert into subCat_tb(subCat_id,subCat_name,cat_id) values(200,'电脑',2001)
    insert into subCat_tb(subCat_id,subCat_name,cat_id) values(201,'美容护理水',2000)


      


    you are welcome
    2011年3月16日 1:35

答案

全部回复

  • Take look at 'cascate update/delete' in books online if there's fkey in the table.
    • 已建议为答案 Ai-hua Qiu 2011年3月17日 2:42
    2011年3月16日 1:46
  • 外键+级联更新/删除即可
    2011年3月17日 1:56
  • 我知道那样子是可以的,现在我想用触发器去实现这个功能.就不知道怎么去实现了
    you are welcome
    2011年3月18日 0:51
  • 这里我有两张表,一张是cat_tb表(大类别表),另一张是小类别表(subCat_tb)

    我想修改\删除\大类别表cat_tb的时候,小类别表也随着改变  

     

    我想用触发器去实现这个功能,要怎么写呢?多谢

     

     

     

     



    you are welcome
    2011年3月18日 0:53
  • Create trigger for update and delete, books online has samples.
    2011年3月18日 3:31
  • create trigger delTrigger

     on cat_tb

    for delete

     as

    begin

     delete from subCat_tb where subCat_tb.cat_id =(select cat_tb.cat_id from cat_tb)

     end

    这样子写什么会错呢?希望高手们可以帮小弟看下,上面的语句,错在哪里,怎么修改呢?多谢


    you are welcome
    2011年3月18日 7:18
  • create trigger delTrigger

     on cat_tb

    for delete

     as

    begin

     delete from subCat_tb where subCat_tb.cat_id =(select cat_tb.cat_id from cat_tb)

     end

    错误提示:DELETE 语句与 COLUMN REFERENCE 约束 'FK__subCat_tb__cat_i__1CF15040' 冲突。该冲突发生于数据库 'login_db',表 'subCat_tb', column 'cat_id'。
    语句已终止。

    这样子写什么会错呢?希望高手们可以帮小弟看下,上面的语句,错在哪里,怎么修改呢?多谢


    you are welcome
    2011年3月18日 7:18
  • Have to delete fkey value first then pkey's.
    2011年3月18日 16:09
  • create table cat_tb (

    cat_id int primary key,

    cat_name varchar(20)

    )

    insert into cat_tb values(2000,'电脑')

    create table subCat_tb (

    sub_id int primary key,

    sub_name varchar(20),

    cat_id int foreign key(cat_id) references cat_tb on update cascade

    )

    insert into subCat_tb values(20,'鼠标',2000) insert into subCat_tb values(21,'键盘',2000)

     

    当我修改cat_tb表cat_id=2000 修改为2011,此时subCat_tb对于的外键也随著改变为2011

    那我想问下,为什么只能用一个条件 on update cascade呢?如果我要删除呢?那就必须要把

    cat_id int foreign key(cat_id) references cat_tb on delete cascade

    这样子不是很麻烦吗?有没有办法,这样子简单的实现修改/删除功能呢?


    you are welcome
    2011年3月19日 1:27
  • You have to work around what sql supports.
    2011年3月19日 4:14
  • I am using is 2000 database, want to use a cascade relations delete/update data
    you are welcome
    2011年3月19日 6:16
  • 经过几天的摸索,终于找到解决的方案;

    1.用触发器解决这个问题

    create trigger cat_sub
    on cat_tb
    for delete
    as
    begin
      delete subCat_tb from deleted sub,cat_tb cat where sub.cat_id=cat.cat_id
    end
    go

     

    2.用级联删除解决这个问题

    create  table subCat_tb
    (
      sub_id int primary key,
      sub_name varchar(20),
      cat_id int foreign key(cat_id) references cat_tb
      on update cascade
      on delete cascade
    )

     

    我在这里有一个问题想问题,虽然这两个问题可以解决这个问题.

    但是我有一个问题,如果用事务呢?或者有数据储存过程呢?要怎么做呢?


    you are welcome
    2011年3月19日 10:41
  • For deleting, delete child first then parent.

    More complex for updating, should delete child then update parent or drop fkey, update both child and parent then recreate fkey. 

    2011年3月19日 15:34
  • 事务和存储过程不影响这个啊
    想不想时已是想,不如不想都不想。
    2011年3月20日 1:51
    版主
  • I guess OP likes to know how to do that in sp without trigger nor cascade delete/update.
    2011年3月20日 3:18
  • 想问你下,那样事务能不能级联删除呢?多谢


    you are welcome
    2011年3月20日 11:31
  • 我想知道,用触发器到底怎么去实现级联删除。多谢
    you are welcome
    2011年3月20日 11:35
  • I would like to know how to use the trigger in the end to realize the cascade delete. Thank you
    you are welcome
    2011年3月20日 11:35
  • You have to write your own code for that with logical like I said in post at 15:34pm on 3-19-11.
    2011年3月21日 1:44