通过附加引用在非唯一引用列上指定外键

时间:2013-08-14 09:35:18

标签: sql reference key unique where

示例:

                                      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

但那显然不可能那样。

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

1 个答案:

答案 0 :(得分:0)

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

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

+-----------+--------+--------+
| unique_id | isDead | old_id |
+-----------+--------+--------+
|   1234    |  false |  1234  |
+-----------+--------+--------+
|     -1    |  true  |  1234  |
+-----------+--------+--------+

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