有表
producttype商品类型
     主要字段:     id  ptname  invokecount 引用次数……
product商品表
      主要字段:    productid unitid 计量单位编号 ptid 商品类型id invokecount 引用次数 ……
unittype计量单位表
      主要字段:   id code 基本计量单位编号 name 基本计量单位名称  invokecount 引用次数 ……
为了数据的完整性 我想做一个触发器:就是当商品类型中的某类型还存在商品时就不得删除该类型;同样当商品中有
商品引用了计量单位那么该计量单位也不得删除!所以我都加了字段invokecount 既是当invokecount 为0是方可删除;
否则每当添加一种商品那么producttype的 invokecount就加1,删除则减1;计量单位的一样!
请各位高手帮忙?谢谢…… 

解决方案 »

  1.   

    CREATE TRIGGER testref1 AFTER INSERT ON product
      FOR EACH ROW BEGIN
       update producttype set invokecount=invokecount+1 where id=NEW.ptid;
       update unittype set invokecount=invokecount+1 where id=NEW.unitid;
      END;
     -- 减1
    CREATE TRIGGER testref2 AFTER DELETE ON product
      FOR EACH ROW BEGIN
       update producttype set invokecount=invokecount-1 where id=OLD.ptid;
       update unittype set invokecount=invokecount-1 where id=OLD.unitid;
      END;
      

  2.   

    很少有这么设计的。
    普通的设计是在删除前检查一下相应表中是否有记录,而不是去维护这个引用计数器(当然操作系统设计中经常会这么干,但数据库设计中难得一见)你可以在 producttype商品类型 表的删除中或者用触发器,或者直接用直接来检查产品表中是否还有相应有记录。
      

  3.   

    就是当商品类型中的某类型还存在商品时就不得删除该类型;同样当商品中有 
    商品引用了计量单位那么该计量单位也不得删除!
    -----------------------------------------
    我觉得你针对这样的需求设置字段invokecount 根本就有点不必要像你这种保持数据完整性的需求,我觉得用外键就可以实现了,没必要用触发器那么复杂alter table product商品表 add foreign key ptid 商品类型id  references producttype商品类型(id);alter table product商品表 add foreign key unitid 计量单位编号  references unittype计量单位表 (id);
      

  4.   

    估计楼主是想用myisam ,否则直接如楼上所说利用innodb的外键约束即可。
      

  5.   

    不管用什么存储引擎,针对他那需求来说,增加invokecount 这个字段有用吗?
    如果按他描述,这个invokecount 是没什么用的
    如果支持外键的话,直接用外键可以处理了
    否则,要分别在“表producttype商品类型”和“表unittype计量单位表”上建立delete触发器。
      

  6.   


    这样情况下建议一:你可以在 producttype商品类型 表的删除中或者用触发器,或者直接在你的程序中检查产品表中是否还有相应有记录。
    二:使用外键约束,在exception中再检查哪个表中有对应的记录。然后提醒用户。
      

  7.   

    那您的意思就还是不建议用invokecount字段吗?
      

  8.   

    1.用存储过程和触发器当然可以实现 只要看看语法就ok了2. 如果抛异常的话,程序就不不走,这样不容易控制,反而还要成程序返回命令对数据库进行删除3.设置外键关联可以解决这个问题 set foreign key 一定要cascade 这样删除主表的商品的时候 从表关联也能删除
    但是要用到innoDB引擎 这个引擎支持外键
    4.你的需求应该在程序端判断
    函数1:int[] query() 返回商品主表的id和count
    查询用商品id分组
    函数2:delete()
    根据返回的count if 0
    delete from shop table
    delete from 从表
    前提id相同
      

  9.   

    其实我也不建议但是我们项目组长还是想那么做!
    而且在相关表中都加了invokecount字段啦!
    所以就让我们建触发器好在程序中中判断invokecount就可以啦!