14

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)はそれ自体と等しくないと推測しています。この場合、この関係を処理する方法はありますか?

どんな助けでも大歓迎です!

4

5 に答える 5

17

これは機能です(私が期待したものでもありませんが)。

このスレッドは、期待する動作を実現するために、キーを主キーにすることを提案しています。

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

UNIQUEインデックスは、NULL以外の値が一意であることを保証します。列がNULL値を受け入れないように指定できます。

于 2009-01-09T21:32:41.740 に答える
3

追加のトリガー/プログラミングなしでこれを処理することを考えることができる唯一の方法は、参照される各テーブルに単一の「上記以外」の値を含めることです。これにより、テストは次のようになります。

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

識別子NO_*はID列に適したタイプ/長さです。あなたがそれを期待するように、これはそれから失敗するでしょう。

于 2009-01-09T21:32:25.143 に答える
0

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

于 2009-01-09T21:35:03.797 に答える
0

NULL 値を解釈して処理する適切な方法があり、OP によって示される動作はまさに意図したものであることに注意することが重要だと思います。あなたはその振る舞いを無視することができ、私からの異議なしにあなたが望むようにあなたの質問を処理することができます.

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

できるだけ早く回答を受け入れてもらうための競争ではありません。審議や連携もその一環だと思います。

于 2009-01-10T04:55:23.610 に答える