これを検索して既存の回答を見つける方法があると確信していますが、ほとんどの結果は、更新をブロックして一意の列を強制するか、2 つの行間で一意の値を交換することを扱っています (これは明らかに MySQL で壊れています)。 )。スワップしたくありません。現在一意の値を持つ行を に更新したいだけですNULL
。
2 つのクエリ (2 列目の person_id が一意である必要がある 2 列のテーブル) でそれを行う方法は次のとおりです。
UPDATE bathroom_occupant
SET person_id = NULL
WHERE person_id = '$person_id';
UPDATE bathroom_occupant
SET person_id = '$person_id'
WHERE bathroom_id = '$new_bathroom_id';
上記は、person_id
現在のbathroom_id
ペアリングから を削除し、person_id
新しいbathroom_id
ペアリングで を配置します。私が望むのはCOALESCE
、1つの行をNULLに設定するために何らかの形式をperson_id
使用し、もう1つの行をquery だけでは、すでに一意の値に設定されている他の行の列の値が自動的に NULL に設定されます。
より簡単な例を使用すると、一意の制約を使用して、学生が同じクラスの 2 つのセクションに登録するのを防ぐことができることを知っています。でもブロックで防ぐのではなく、「動く」で防ぐことはできないのでしょうか?