2009年11月13日

MySQLでの一意制約(ユニーク制約)での盲点

解ってる人にはいまさらなんでしょうけど、MySQL(5.0)で見事失敗したので書き残しておく。

複数カラムの値を合わせればユニークにならないといけないテーブルなんで、そのように一意制約(unique制約)を設定しておいた。
そう設定されてるんだから安心してどんどん値を放り込んでいったんだが、ある程度放り込んだところで何の気なしにSELECTしてみると、重複レコードがけっこう発生している。
ユニーク制約は二つのカラムの複合、ひとつはnot nullだが、もう一方はnullもOK。そうするとMySQLとしては「全てのnullはユニーク(異なる値)」として解釈するようです。(nullの定義からして、それで正しいのではありますが…)というわけで、

'abcdefg', null ←INSERT成功
'abcdefg', null ←INSERT成功してしまう

という風に、二つのレコードは「異なるもの」として一意制約に反しないから、あっさり重複書き込みが可能。(重複ってのは私という人間から見てに過ぎんわけです)

今回は幸いnullの変わりに空文字列を入れても支障無い用途でしたので、

'abcdefg', '' ←INSERT成功
'abcdefg', '' ←INSERT拒否られて目出度し目出度し

で逃げられますが、こういう逃げが出来ない場合はどうなるのかなぁ? (事前に一旦SELECTして確認する? やりたくないなぁ)


ラベル:DB SQL MySQL
posted by 管理者 at 13:10| Comment(0) | TrackBack(0) | MySQL | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。

この記事へのトラックバック
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。