几天来回答不出的原帖:http://www.csdn.net/expert/topic/999/999991.xml?temp=.9947016

解决方案 »

  1.   

    create table bottomTable(
    bottom_id integer primary key,
    top_id integer not null,
    sub_top_id integer not null,
    foreign key (top_id) references topTable(top_id) ,
    foreign key (sub_top_id) references subTopTable(sub_top_id) on delete cascade)top_id的级联删除没有必要保留,因为表一中删除记录自然删除表2中记录,而删除表2中记录自然要删除表3中记录。
      

  2.   

    如果在bottomTable中去掉了foreign key(top_id)的话,因为bottomTable表中的top_id字段的取值必须与topTable表的top_id相一致,插入数据可以自己定没问题,但到删除记录的时候,问题就出现了,如果我在topTable表中删除记录,其记录相关字段的值是与bottomTable表的top_id相同的,原则上在bottomTable表中的相应记录也应被删除才对,你现在去掉了,会导致在bottomTable表中的相应记录没没有被删除,这样出现的数据就不对应了,怎么办?去掉foreign key(sub_top_id)原理一样!
    =================================================================
    假设有如下的记录:topTable
    --------------------------------
    100 , 1
    200 , 2subTopTable
    ---------------------------------
    100 , 100 
    101 , 100
    102 , 200bottomTable
    ---------------------------------
    900, 100 , 102
    901, 200 , 102以上的记录,如果我在topTable表中删除记录100,如果在bottomTable表中去掉外关键字top_id,在bottomTable表中的记录900肯定删除不了,那么就会出现数据与实际不相符。有没有理解错,请指教!!!
      

  3.   

    不好意思,看错了。好像不符合范式,最后一个表有数据冗余(top_id冗余)。
      

  4.   

    把on delete cascade语句去掉就可以了,虽然去掉了on delete cascade约束,但是外键约束仍然存在,在你增加或删除数据时数据库都会帮你校验数据的完整性的,只是不会做级联删除的动作罢了,不过级联删除的效果可以通过触发器或存储过程来完成。你的级联删除循环了,sql中给你的错误提示说得很明白,你应该可以看得懂,这点是sql比oracle和db2严谨的地方,对于oracle和db2数据库,由于外键约束的乱用造成数据不准确和其他一些莫名其妙的事情经常发生,所以在这些数据库中一定要很了解这些才会成为一个优秀的数据库设计者,而这些数据库本来就是给会用的人用的,不能说是他们说好谁坏,只能说sql同oracle和db2的侧重点不同吧。
      

  5.   

    你的表设计有问题,层次不清造成逻辑错误。
    topTable应该是第一层,subTopTable是第二层,bottomTable是第三层。
    应该将bottomTable中的
    “top_id integer not null,”和
    “foreign key (top_id) references topTable(top_id) on delete cascade,”两句都去掉。
    bottomTable因为与subTopTable表中的sub_top_id外键关联,所以通过这个关系可以取到sub_top_id表中的ref_top_id值,此值可以代替bottomTable原来的“top_id integer not null,”。
    不知你明白否?
      

  6.   

    To:gzhughie(hughie)我只学过存储过程,也会编,但真正在程序中还不知怎样用,只在管理器中用过,可不可以讲一下如何在程序中应用?注意:本项目以前是没用到存储过程的,所以知道可能在程序中也没什么作用。(但我个人想知道!)-----------------------------------------------------------------------To:tj_dns(愉快的登山者)好像有点道理,我在这之前也想过这个想法,不过后来想来想去又想晕了头了,因为该表的top_id字段不可以删除啊!
      

  7.   

    没理由以前建的表,由于在其他的数据库中应用没问题,然后现在SQL Server数据库中应用,遇到不行就删除,这样做法应该不规范吧!
      

  8.   

    各种数据库都有自己的个性,除非你使用的是特别公认的东西,否则不可能无修改的移植。我赞同gzhughie(hughie)的意见。如果你想提高可移植性,在创建DB时就应该多考虑。
      

  9.   

    把on delete cascade语句去掉,然后我在topTable中删除记录的时候,就会出错不能删除的!!!(没用存储过程)看来又是没解!!!
      

  10.   

    bottomTable的top_id不可以删除,就取同sub_top_id表中的ref_top_id值相同的值,也可以。但必须去掉“foreign key (top_id) references topTable(top_id) on delete cascade,”
      

  11.   

    把on delete cascade语句去掉,然后我在topTable中删除记录的时候,就会出错不能删除的!!!(没用存储过程)看来又是没解!!!可以建个触发器来强制保证数据完整性。
      

  12.   

    是不是由于sql server 的版本不对?7。0是不支持的,2000下应该没有问题。
      

  13.   

    将 FOREIGN KEY 约束 'FK__bottomTab__sub_t__7D78A4E7' 引入表 'bottomTable' 中将导致循环或多重级联路径。请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其它 FOREIGN KEY 约束。
    上面是在2000下的报错,很明显,是吗
      

  14.   

    我是说这句话早就知道 “
    将  FOREIGN  KEY  约束  'FK__bottomTab__sub_t__7D78A4E7'  引入表  'bottomTable'  中将导致循环或多重级联路径。请指定  ON  DELETE  NO  ACTION  或  ON  UPDATE  NO  ACTION,或修改其它  FOREIGN  KEY  约束。  
     
      

  15.   

    再过两天才结帖吧,反正不到最后一天我还要找办法,如果实在没办法,就把那个foreign key去掉!
      

  16.   

    你设计的数据库的确是因为不符合范式,才造成这个问题,可以考虑把最后一个表改成这个样子:
    create table bottomTable(
    bottom_id integer primary key,
    sub_top_id integer not null,
    foreign key (sub_top_id) references subTopTable(sub_top_id) on delete cascade)
      

  17.   

    最后还是要自己想办法!!!(不过最有可能的是:以前的数据库设计出了问题!)Thanks for all!