我有一些表:
idask
idpref
,fk_idask
,fk_idstructure
idstructure
id
和fk_id
之间的所有约束以及表PREFERENCES(fk_idask
,fk_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
和fk_idpref
的ASSIGNATION表。
现在,如果我删除由ASSIGNATION链接的首选项约束中断。
我已经找到了解决方法,但很难看。这个问题有一些理智的解决方案吗?
感谢您的回答!
PS。抱歉我的英文不好:(
答案 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选项。这意味着当您删除引用表中的行时,数据库引擎会自动删除外键表中的相关行。
另一个经常使用的选项是保留行,但将它们标记为非活动状态。这可以通过添加“有效位”列来完成。查询时,过滤掉标记为非活动的行。