MySQLのupdateでカラムの値を+1する方法

Read More

MySQLのupdateで今あるカラムの値を+1する方法。


例えばuserテーブルにlogin_cntというカラムがあったとする。
そのカラムを+1するには以下のようなupdate文を書く。

■カラムの値を+1するSQL
UPDATE user SET login_cnt = login_cnt+1 WHERE account='{account}';
# {}は任意の値

set句で カラム名+1 とするだけ。

これでupdate文を実行するたびにカラムの値が+1される。


注意点はテーブル定義の際に、
・login_cntカラムはint(数値型)であること
・初期値を0とし、nullを許可しないこと
とすること。




このカラム+1のSQL、結構使うくせに書き方を毎回忘れちゃう。
シングルクォートいるんだったっけー?とかなる。
やれやれ。




--
ちなメモ: SQL文法の注意点
SQLを書く際は、update文やset句、now関数などの予約語は大文字で書くことを癖付けること。



メモ2: ログインの仕組みについて
厳格なログインの仕組み(アカウントロック)についての考察。

userテーブルのカラムには、
・login_cnt(実際にログインした回数)
・login_fail_cnt(アカウントに対しログインを試みて失敗した回数)
を記録すること。

login_fail_cntが3回(正確には3の倍数)になった時点でログイン制限として現時刻より+1時間のアカウントロック制裁をかける。
・lock_ticket_date(ロックチケットの有効日時)


このロックチケットを解除する方法は3つ考えられる。


1つはcronによって定期的にチェックをかけ、有効日時を超えていたらそのレコードのlock_ticket_dateの値をnullにする。
これ単体の場合、クーロンの実行間隔をかなり短く設定する必要がでてくるので他の案と併用するのがよい?


もう1つはユーザがログインしようとしたときにロックチケットを解除する。
ログインしようとした際、ロックチケット有効日時を越えていた場合にlock_ticket_dateをnull値にする。
その後通常のログインプロセスへと進む。

ログインしようとした際、まだロックチケット有効日時を越えてない場合はロックを解除せず下記メッセージを出す。
「本アカウントに対しただいまアカウントロックがかけられています。
ロック解除は下記の時刻となります。
ロック解除予定時刻:○○日○○時○○分」

なおロックチケット解除の際、lock_ticket_dateをnull値にするがlogin_fail_cntは0に戻す必要はない。
これはロックチケットの発行は3の倍数を使って行うため。


もう1つは管理画面からの解除。
カスタマーサポートがあるならまず間違いなく必要となる。



プログラムを組む上で注意すべき点は
・lock_ticket_dateが有効中にlogin_fail_cntを増やさないこと
・lock_ticket_date有効中はユーザ権限の全てを無効とすること


しかしロックチケットを実装するとログインに関係するプログラムを組む際に複雑化しバグの温床となりえる。
また、ユーザ側からみてもうっとおしいばかりなので正直よほど大きなシステム以外ではロック機能とかいらない。

ただログイン失敗のカウントは、ロックチケットの実装うんぬんに関わらずログイン機能があるものならば常に記録しておくべき値だと思う。