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は実際にはユニークではありません。2 番目のテーブル (つまりunique_idisDead) の 2 つの列でキーを作成する必要があります。-それからそれはユニークな組み合わせになります。しかし、それを外部キーで適切に参照することはまだできません。

外部キーを介して参照する必要がある場合は、有効な所有者のみを 2 番目のテーブルに格納する必要があります。たとえば、有効でない所有者は削除します。それらを保持したい場合は、unique_idいくつかのアルゴリズムに従ってそれらを更新する必要があります。これにより、一意の値が保持され、同時に有効な値と無効な値を分離できます。これに加えて、古い値を保存する必要があります。unique_idたとえば、次の名前の新しい列を作成しold_idます。

+----------+--------+--------+
| | unique_id | 死んだ | old_id |
+----------+--------+--------+
| | 1234 | 偽 | 1234 |
+----------+--------+--------+
| | -1 | 真 | 1234 |
+----------+--------+--------+

ご覧のとおり、可能な (最善ではない) 解決策の 1 つは、unique_id負の値に設定することです。上記の例では、外部キーを介して正しい行を参照し、old_id保存されているため所有者の接続を復元できます。何を達成しようとしているのかわからないので、一般的には最適な方法ではない可能性があります。

于 2013-08-14T09:45:10.370 に答える