2009-05-25 58 views
0

我有一些表:有问题的删除与SQL指数

  • 表要求与idask
  • 表首选项时idpreffk_idaskfk_idstructure
  • 表结构与idstructure

与所有的约束在idfk_id之间的一个唯一索引表格PREFERENCES(fk_idask,fk_idstructure)。

问题是当我在预置中有两行时。

`IDPREF` `FK_IDASK` `FK_IDSTRUCTURE` 
1   1   1 
2   1   2 

如果我要反转(开关?)两个结构偏好

`IDPREF` `FK_IDASK` `FK_IDSTRUCTURE` 
1   1   **2** 
2   1   **1** 

FK_IDASK之间的唯一索引FK_IDSTRUCTURE分手之间,因为有两首选项的第一个更新结果同样要求具有相同的结构。

为了防止这种情况,我做了一个函数deleteAndResave,这个问题暂时解决了。

但现在到达ASSIGNNATION表idassignationfk_idpref

现在,如果我删除了由ASSIGNATION链接的首选项约束中断。

我已经找到解决办法,但很丑。对于这个问题有一些理智的解决方案?

感谢您的回答!

ps。对不起,我的英语不好:(

回答

1

你可以试试这个:

UPDATE 
    PREFERENCES 
SET 
    FK_IDSTRUCTURE = 3 - FK_IDSTRUCTURE 

现在,因为它是一次性运行时,“C”(一致性)的“酸”是指外键和独特的处理方式“中”,但会确定之前和之后。

可以用case语句皮条客的声明对于更复杂的东西

UPDATE 
    PREFERENCES 
SET 
    FK_IDSTRUCTURE = CASE FK_IDSTRUCTURE 
     WHEN 2 THEN 1 WHEN 1 THEN 2 ELSE FK_IDSTRUCTURE END 
+0

第一个工作只为交换案件。 (在我的真实情况下,用户可以选择结构并可以意外交换结构,但这不是规则)。 顺便说一下,第二个例子有点泛化可以工作...明天我试试看。 – thebol 2009-05-25 14:27:59

-1

严,表索引之间倒置的两个结构和分手吧!

不管怎样,我猜你的外键指向了错误的方式。它看起来像外键是上分配,并指着偏好。

外键应该是喜好和参考分配。

另一种选择是需要考虑的一个ON DELETE外键CASCADE选项。这意味着,当你删除的行所引用的表中,数据库引擎会自动删除外部中的相关行ñ关键表。

另一个常用的选项是保留行,但将它们标记为不活动。这可以通过添加“活动位”列来完成。查询时,过滤出标记为非活动状态的行。

+0

,如果我改变的喜好分配不能被删除。 关于指向赋值的偏好...是的,这解决了这个问题。但另一方面,如果我删除一个分配,我需要删除首选项上的外键(这导致一个更新为空和删除)。我不太喜欢它 – thebol 2009-05-25 10:56:09