1

例子:

                                      survivor table

        owner_id                   unique_id    isDead  
      |__________                 |__________|__________
      |              foreign key  |          |    
      |   1234      ------------> |   1234   |   true  <--- this row is referenced
      |__________                 |__________|__________
                                  |          |    
                                  |   1234   |   false <--- this row should be referenced
                                  |__________|__________

目前代码是这样的:

CONSTRAINT `key_2` FOREIGN KEY (`owner_id`) REFERENCES `survivor` (`unique_id`)

我想让它的功能是这样的:

CONSTRAINT `key_2` FOREIGN KEY (`owner_id`) REFERENCES `survivor` (`unique_id`) WHERE `isDead` = false

但这显然是不可能的。

有谁知道我如何实现这样的目标?

4

1 回答 1

0

unique_id实际上并不是独一无二的。您应该在第二个表中通过两列创建一个键(我的意思是unique_idisDead)。- 那么这将是独特的组合。但是您仍然无法通过外键正确引用它。

如果您需要通过外键引用它,您应该只在第二个表中存储有效的所有者:例如,删除那些无效的所有者。如果要保留它们,则必须unique_id根据某种算法对其进行更新,以保留唯一值,同时允许将有效值与无效值分开。除此之外,您还需要存储旧值unique_id- 例如,创建一个名为的新列old_id,它将是:

+-----------+--------+--------+
| 唯一标识 | 死了 | old_id |
+-----------+--------+--------+
| 第1234章 假 | 第1234章
+-----------+--------+--------+
| -1 | 真实 | 第1234章
+-----------+--------+--------+

如您所见,一种可能(但不是最佳)的解决方案是设置unique_id为负值。在上面的示例中,您将通过外键引用正确的行,并且仍然能够恢复所有者的连接,因为old_id已存储。我不确定您要达到什么目标,因此总的来说这可能不是最佳方式。

于 2013-08-14T09:45:10.370 回答