まず、これがだましである場合はお詫び申し上げます。
会社のテーブルがあるとします。
id | company_name
----+--------------
1 | Someone
2 | Someone else
...そして連絡先の表:
id | company_id | contact_name | is_primary
----+------------+--------------+------------
1 | 1 | Tom | 1
2 | 2 | Dick | 1
3 | 1 | Harry | 0
4 | 1 | Bob | 0
1 つだけのレコードに各コモンのフラグが設定されている必要がcontacts
あるように、テーブルを設定することは可能ですか?is_primary
company_id
だから私がやろうとした場合:
UPDATE contacts
SET is_primary = 1
WHERE id = 4
Tom
... ( id = 1
) は の主要連絡先として既にフラグが設定されているため、クエリは失敗しますcompany_id = 1
。またはさらに良いことに、クエリが成功するようにトリガーを作成することは可能ですが、同じ操作Tom
でis_primary
フラグがクリアされますか?
company_id
テーブルに存在するかどうかをチェックすることはあまり気にしませんcompanies
。私の PHP コードは、この段階に到達する前に既にこのチェックを実行していたはずです (ただし、同じ操作でこれを行う方法があれば、それは素晴らしいことだと思います)。 .
最初にこれについて考えたとき、「それは簡単だろう。列company_id
とis_primary
列に一意のインデックスを追加するだけだ」と思ったが、明らかにそれはうまくいかない。 3 番目の連絡先を追加しようとすると失敗します。しかし、私が必要とする最小限の機能を提供する一意のインデックスを構成する方法があると感じずにはいられません。つまり、2 番目の主要な連絡先を追加しようとする試みを拒否したり、主要な連絡先のない会社を離れようとする試みを拒否したりします。
テーブルに FK を使用してテーブルにprimary_contact
フィールドを追加するだけでよいことはわかっていますが、面倒です。両方のテーブルが他のテーブルに FK を持つという考えは好きではありません - 両方のテーブルが互いに依存するのではなく、一方のテーブルが他方に依存するべきだと私には思えます。時間が経つにつれて、何かがうまくいかない可能性が高くなると思います。companies
contacts
総括する:
- 指定された 1 つのレコードだけ
company_id
にis_primary
フラグが設定されるように連絡先テーブルを制限するにはどうすればよいですか? - 互いに FK を持つ 2 つのテーブルが良い/悪い考えであるかどうかについて、誰か考えがありますか?