0

我有一些表:

  • 表问与idask
  • 带有idpref, fk_idask,的表首选项fk_idstructure
  • 表结构与idstructure

与表 PREFERENCES ( , )之间的所有约束idfk_id唯一索引。fk_idaskfk_idstructure

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

`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 并暂时解决了这个问题。

idassignation但是现在用and到达了 ASSIGNATION 表fk_idpref

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

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

感谢你的回答!

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

4

2 回答 2

1

你可以试试这个:

UPDATE
    PREFERENCES
SET
    FK_IDSTRUCTURE = 3 - FK_IDSTRUCTURE

现在,因为它一次性运行,“ACID”中的“C”(一致性)意味着外键和唯一性在“期间”处理,但前后都可以。

您可以使用 CASE 语句对语句进行拉皮条处理更复杂的内容

UPDATE
    PREFERENCES
SET
    FK_IDSTRUCTURE = CASE FK_IDSTRUCTURE 
        WHEN 2 THEN 1 WHEN 1 THEN 2 ELSE FK_IDSTRUCTURE END
于 2009-05-25T12:03:25.097 回答
-1

是的,在表索引和分解之间反转了两个结构!

无论如何,我猜你的外键指向错误的方向。看起来外键正在分配,并指向首选项。

外键应该是关于preferences 和REFERENCE 分配的。

另一种选择是考虑外键上的 ON DELETE CASCADE 选项。这意味着当您删除引用表中的行时,数据库引擎会自动删除外键表中的相关行。

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

于 2009-05-25T10:44:11.013 回答