deleted_at を UNIQUE INDEX に加えても NULL の比較は必ず偽を返すので制約にならない。
これどういう意味だろう、と思って調べたら、
MySQL のNULL ではまったことあれこれ - Slow Dance
NULL を許可するカラムにユニークインデックスを貼った場合、各々のNULL は別の値として区別され、重複エラーを発生させない MySQL :: MySQL 4.1 リファレンスマニュアル :: 6.5.3 CREATE TABLE 構文
と書いてあって、そうなんだ超ヤベーじゃんと思った。
そもそも冒頭の
NULL は未定義または、不明を意味する。
という時点でエッという感じで、通常の感覚なら空文字とUNDEFとNULLは区別するだろ、と思ったのだけど、データベース的世界観ではそうではないらしい。NULLはUNDEF相当のようだ。それなら、ユニークインデックスの件についても納得できるというものだ。
この辺りまともにRDBについて勉強していれば当たり前に知っているべきことだと思うんだけど、実際のところ自分は不勉強で知らない。 何故勉強してないのかというと、これまであまり業務で対面する機会が無かったのもあるし、単純にRDBに興味が無いので無視をしてきたというところがあるけれど、最近はそうも言ってられない感じになってきているので早急に学習をする必要性を感じている。
こういう無知をさらけ出すのは恥ずかしいことなのだけど、恥ずかしいからといって表に出さないでいても虚栄心を満たすだけでしか無いので、引き続きどんどん書いていこうと思っている。