質問

4つの異なるパーツのいずれかを含めることができるリレーションを作成しようとしていますが、同じパーツのコレクションは一意として処理する必要があります。

例: 割り当てには会社が割り当てられている必要があり、オプションで場所、ワークグループ、プログラムが割り当てられている場合があります。 割り当てには、場所のないワークグループがない場合があります。

会社A、B、Cがあるとします。ロケーションX、Y、Z。ワークグループI、J、Kおよびプログラム1、2、3。

したがって、有効な関係には A-X-I-1 A-Z-2 B-Y C C-3 B-Z-K

ただし、無効な関係には A-K(場所のないワークグループ) Y-K-1(会社なし)

だから、テーブルを作成するために、私は作成しました

companyID INT NOT NULL,
FOREIGN KEY companyKEY (companyID) REFERENCES company (companyID),
locationID INT,
FOREIGN KEY locationKEY (locationID) REFERENCES location (locationID),
workgroupID INT,
FOREIGN KEY workgroupKEY (workgroupID) REFERENCES workgroup (workgroupID),
programID INT,
FOREIGN KEY programKEY (programID) REFERENCES program (programID),
UNIQUE KEY companyLocationWorkgroupProgramKEY (companyID, locationID, workgroupID, programID)

これは、ワークグループがあれば、割り当ての必要性以外にすべての私の関係を処理するだろうと考えています(プログラムまたはトリガーを使って喜んで行うことができます)

ただし、このスキーマをテストすると、次のように入力できます...

INSERT INTO test VALUES (1, null, null, null), (1, null, null, null);

...文句なし。 nullが含まれているため、(1、null、null、null)はそれ自体に等しくないと推測しています。この場合、この関係を処理する方法はありますか?

ご協力いただければ幸いです!

役に立ちましたか?

解決

これは機能です(ただし、私は期待していませんでした)。

このスレッドでは、キーをプライマリキーにして、期待する動作を実現することを提案しています。

  

これは機能です-NULL値は   未定義の値、したがって2つのNULL   値は同じではありません。することができます   少し混乱しますが、理にかなっています   あなたはそれについて考えます。

     

UNIQUEインデックスは、   NULL以外の値は一意です。あなたは出来る   列が受け入れられないことを指定します   NULL値。

他のヒント

追加のトリガー/プログラミングなしでこれを処理する唯一の方法は、単一の「上記のどれでもない」を使用することです。テストが次のようになるように、参照される各テーブルの値

INSERT INTO test VALUES (1, NO_LOCATION, NO_WORKGROUP, NO_PROGRAM),
                        (1, NO_LOCATION, NO_WORKGROUP, NO_PROGRAM)

NO _ * 識別子がID列の正しいタイプ/長さである場合。予想どおり、これは失敗します。

MySQL NULL!= NULL、またはその他。そのため、UNIQUEは機能しません。空白の場合は、ゼロなどの別のデフォルト値を使用する必要があります

NULL値を解釈して処理するための適切な方法があり、OPが示す動作は意図したとおりであることに注意することが重要だと思います。あなたはその振る舞いを無視することができ、私からの異議なしにあなたが望む方法であなたのクエリを扱うことができますが、それは「受け入れる」のが良いかもしれません。非標準の個人的な好みではなく、何らかの形のベストプラクティスを説明する回答。

またはコンセンサスのベストプラクティスに同意しない場合は、回答を受け入れることはできません。

できるだけ早く回答を受け入れるのは、競争ではありません。審議とコラボレーションもプロセスの一部となることを意図しています。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top