値が「xyz」の場合を除いて、MY_COLUMN の値を一意にしたいテーブルがあるとします。つまり、MY_COLUMN は複数の行で「xyz」になる場合がありますが、「xyz」ではないすべての値は一意でなければなりません。これを達成する制約を設定することは可能ですか?
3 に答える
ドキュメントによると
UNIQUEインデックスは、インデックス内のすべての値が異なる必要があるような制約を作成します。既存の行と一致するキー値を持つ新しい行を追加しようとすると、エラーが発生します。すべてのエンジンで、UNIQUEインデックスは、NULLを含む可能性のある列に複数のNULL値を許可します。
したがって、null許容列を作成し、テーブルにクエリを実行するときは、を使用しますISNULL(MY_COLUMN, 'xyz')
。
これを行うための制約を設定することはできませんが、Javaプロジェクトなどの内部でこれを行う場合は、次のようなことができます。
If (MY_COLUMN != "xyz"){
Get records of table with "xyz" in it
X = //maping would equal "Select MY_COLUMN from table" (or select * from table depending on your mapping
次に、一致するものがあるかどうかを確認し、一致しない場合は、挿入ステートメントを実行します。このフリーランスを実行している場合は、trueの場合はブール値である可能性があり、MY_COLUMN ='xyz'である場合は、MY_COLUMNを調べてvalを取得します。それはトリッキーなものです。
これについて考えたので、私は自分の意見を提供すると思います。
他の回答で正しく指摘されているように、MySQL は重複する UNIQUE インデックスを持つことはできません。
これが混乱を招く可能性がないという事実や、このようなことを「すべき」かどうかについて議論するつもりはありません。
my_column に通常のインデックスを設定するだけでなく、それを NOT NULL に設定することで、同じ結果であると私が信じていることを達成できます (これがないと、トリガーが重複インデックスでエラーをスローしないため、これは重要です)。次に、次のように my_table の TRIGGER を作成できます。
CREATE TRIGGER my_table_unique_index_with_exception BEFORE INSERT ON my_table
FOR EACH ROW BEGIN
IF NEW.my_column != 'xyz' THEN
-- The value isn't 'xyz' so only one instance of this value is allowed
-- check the count and if the value exists set it to NULL which will thorw
-- an error as my_column annot be NULL
IF (SELECT COUNT(*) FROM my_table WHERE my_table.my_row = NEW.my_column) > 0 THEN
SET NEW.my_column = NULL;
END IF;
END