小弟要做一个非常简单的留言板,建立了下面3个表,其功能、结构和关系如下:myClients表
功能:保存用户的用户名和口令
字段1(用户名):  name  varChar(50)----------------主键
字段2(口令):password  varChar(50)
notes表
功能:保存用户发布帖子的标题、内容、发布时间、用户名和帖子ID
字段1(帖子主题):        subject  varChar(100)
字段2(帖子内容):        content  varChar(1000)
字段3(发布时间):            time  datetime
字段4(该帖子ID):              ID  int(4)--- ----主键 
字段5(发布帖子的用户名字) : name  varChar(50)---myClients表的外键,并设置为级联删除和更新,目的是当我删除myClients表中的某个用户后,该用户发布的所有帖子都全部被自动删除(设置成功)。
   backNotes表(该表没有设置主键)
功能:保存用户回复某帖子的信息
字段1:(回复的内容):     content varChar(1000)
字段2(被回复帖子的ID):  ID  int(4)----notes表的外键,并设置为级联删除,目的是当该帖子被删除时,它的所有回复也全被自动删除(设置成功)
字段3(回复帖子的用户):  name varChar(50)----myClients表的外键,想设置为级联删除和更新,目的是当我删除某个用户的时候,该用户给所有帖子的所有回复都将被全部删除,但问题就在这儿-----设置失败,系统又没有给出具体的原因,而我看了很久都不知道又什么问题,请大家帮我看看是怎么回事吧?谢谢了!!

解决方案 »

  1.   

    'myClients' 表成功保存
    'notes' 表成功保存
    'backNotes' 表
    - 不能创建关系 'FK_backNotes_myClients'。  
    ODBC 错误: [Microsoft][ODBC SQL Server Driver][SQL Server]将 FOREIGN KEY 约束 'FK_backNotes_myClients' 引入表 'backNotes' 中将导致循环或多重级联路径。请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其它 FOREIGN KEY 约束。
    [Microsoft][ODBC SQL Server Driver][SQL Server]未能创建约束。请参阅前面的错误信息。
    -------------------------------------------------------------------------------
    请问是这个吗?谢谢!
      

  2.   

    我建表时,没有用SQL语句,是直接用鼠标点建立的:)我该怎么给你相关信息呢?谢谢!
      

  3.   

    系统其实已经告诉你原因如下了
    ODBC 错误: [Microsoft][ODBC SQL Server Driver][SQL Server]将 FOREIGN KEY 约束 'FK_backNotes_myClients' 引入表 'backNotes' 中将导致循环或多重级联路径。请指定 ON DELETE NO ACTION 或 ON UPDATE NO ACTION,或修改其它 FOREIGN KEY 约束。
      

  4.   

    ^^事实上,FK约束并不能胜任复杂的逻辑,你的情况可以通过写几个Trigger来解决问题
      

  5.   

    是你的backNotes表外键设置有问题。
    问题在于:“字段3(回复帖子的用户):  name varChar(50)----myClients表的外键”
    就是这个外键导致的错误,必须删除这个外键或字段,因为这个外键的确会导致级联死循环。
    请看:
    删除myClients表中的Name->通过notes表中的name列外键,级联删除notes表中的同名Name记录->通过backNotes表中的帖子id列外键,级联删除backNotes表中的同名帖子id记录
    这就完成了你所需要的级联逻辑了,如果再在backNotes表中加入字段3并建立myClients表的外键,SQLSERVER就通过第二条级联路径到达了backNotes表,这就导致有二条路径能够到达backNotes表,从而形成了一个环,这是SQLSERVER所不允许的,所以会出错。请楼主删除backNotes表中的字段3试试,应该能达到你想要的效果。
      

  6.   

    但是backNotes表中的字段3需要使用啊,其作用是:只有在myClients表中出现的用户名才能回复别人发布的帖子,当该用户从myClients表中被删除时,那么该用户给别人帖子的回复将全部被删除
      

  7.   

    楼主的意思是删除注册用户(myClients表)时,同时删除该用户已发的所有贴(Notes表)和所有给别人回复的贴(backNotes表)。你的逻辑无懈可击,但SQLSERVER2000就是不能这样做,一定会导致级联路径错误。举个简单例子,假设一个表中有二个字段都使用同一个主键表做外键,在建立外键时设置为级联更新或级联删除,那么只能成功一个,第二个外键肯定会导致你现在遭遇的错误。这种情况和你现在的情况本质上是一样的,只不过这个例子的级联路径最短而已!很多人都遇到过这种情况,只好用触发器完成级联更新或级联删除。不过SQLSERVER的这一级联错误确实令人疑惑不解,因为如果使用外键会导致级联错误的话,那么即使使用触发器来完成级联效果也应该会导致循环或多重级联路径啊?但事实是触发器的确完成了本应该属于外键来完成的级联效果,而且还没有错!这就好像微软做了一件脱裤子放屁的事^_^。本人只是与楼主同感,也曾经被这个问题困扰多日,免不了触景生情,借机一吐为快。
    不知道SQLSERVER2005是怎么处理这个问题的。
    请邹剑或其他朋友帮忙指教一下。