代码之家  ›  专栏  ›  技术社区  ›  thebol

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

  •  0
  • thebol  · 技术社区  · 15 年前

    我有几张桌子:

    • 表问 idask
    • 表首选项 idpref , fk_idask , fk_idstructure
    • 表格结构 idstructure

    所有的约束 id 以及 fk_id 以及表首选项上的唯一索引( 福克伊达克 , FKI结构 )

    问题是当我有两行参数时。

    `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 分解,因为第一次更新会导致同一个任务具有相同结构的两个首选项。

    为了防止出现这种情况,我创建了一个函数delete和save,这暂时解决了这个问题。

    但现在到达分配表 idassignation fk_idpref .

    现在,如果我删除了一个通过赋值链接的首选项,约束就会中断。

    我已经找到了一个解决办法,但很难看。这个问题有什么明智的解决办法吗?

    谢谢你的回答!

    PS.对不起我的英语不好:(

    2 回复  |  直到 12 年前
        1
  •  1
  •   Andomar    15 年前

    你可以试试这个:

    UPDATE
        PREFERENCES
    SET
        FK_IDSTRUCTURE = 3 - FK_IDSTRUCTURE
    

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

    对于更复杂的内容,可以用case语句拉住该语句。

    UPDATE
        PREFERENCES
    SET
        FK_IDSTRUCTURE = CASE FK_IDSTRUCTURE 
            WHEN 2 THEN 1 WHEN 1 THEN 2 ELSE FK_IDSTRUCTURE END
    
        2
  •  -1
  •   Andomar    15 年前

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

    不管怎么说,我猜你的外文钥匙指向错误的方向。看起来外键在分配中,并指向首选项。

    外键应该在首选项和引用分配上。

    另一个选项是考虑外键上的on-delete cascade选项。这意味着当删除被引用表中的行时,数据库引擎会自动删除外键表中的相关行。

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