使用SQL索引进行有问题的删除

时间:2009-05-25 10:28:28

标签: sql indexing sql-update

我有一些表:

  • 表格问idask
  • 表格首选项idpreffk_idaskfk_idstructure
  • 表格结构idstructure

idfk_id之间的所有约束以及表PREFERENCES(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_IDASKFK_IDSTRUCTURE之间的唯一索引会中断,因为第一次更新会导致同一个具有相同结构的请求的两个首选项。

为了防止这种情况,我创建了一个函数deleteAndResave,这就解决了这个问题。

但是现在到达了带有idassignationfk_idpref的ASSIGNATION表。

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

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

感谢您的回答!

PS。抱歉我的英文不好:(

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:-1)

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

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

外键应该是首选项和REFERENCE分配。

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

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