<< Prev Page Next Page >>

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


DBデータの論理削除

RDBに登録したデータをアプリケーション上で削除するときに、削除フラグのカラムを利用して論理削除するというのはよくある話。

でも、論理削除をするために、せっかくRDB使ってるのに、ユニーク制約が使えなくなってしまったりするのが痛い。たとえばユーザーテーブルのメールアドレスとかログイン名はユニークにしたいんだけど、間違って削除しちゃっても元に戻せるようにしてほしい、とか。

まあどうせユニーク制約つけたところでユーザー登録画面でSELECTして重複チェックする手間が省けるわけじゃなし、仕方ないと思ってきたけど、解決方法あった。

こんな感じにすればいい。例としてユーザーテーブル。


CREATE TABLE `user` (
user_id int(10) unsigned NOT NULL,
email varchar(150) NOT NULL,
login_name varchar(40) NOT NULL,
delete_flg int(10) unsigned NOT NULL default '0',
PRIMARY KEY (user_id),
UNIQUE KEY email (email,delete_flg),
UNIQUE KEY login_name (login_name,delete_flg),
KEY delete_flg (delete_flg)
)

で、レコードを論理削除するときは

UPDATE user SET delete_flg = user_id WHERE user_id = :uid

と、主キーの値をコピーするようにすることにする。
こうすれば、削除されてないレコードの中ではemailとlogin_nameが一意であることが保証される。
もちろん、削除されてないレコードをSELECTするときのSQLは従来と変わらない。

flgなのにBOOLじゃなくてINTってどうなんだ、という問題もあるけど、使い方としては、フラグそのものなので、カラム名はflgでいいんじゃないかと思う。


この記事に対するコメント

この記事に対するコメントの投稿



管理者にだけ表示を許可する

この記事に対するトラックバック

トラックバックURL
http://tockri.blog78.fc2.com/tb.php/224-dab00a6d
この記事にトラックバックする(FC2ブログユーザー)

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。