更新系SQLを手で打つときに気をつけていること
wakateweb #10
Oct 16th, 2015
Profile
はてな東京オフィス
- SHIBAFUあります。キャパ60名程度。
- 僕より若手もいます
はてな東京オフィス
TATAMIあります
更新系SQLを手で打つ時に気をつけていること
- やりたくない
- 本番DBシェルとか入ってると寿命が縮まってる感がヤバい
- 手作業でデータを更新しないといけない時はある
作成時の心得
WHERE条件をつけまくる
UPDATE
user
SET age = 35 WHERE
id = 1 AND
name = 'Songmu' AND
age = 34
- idだけで絞れるけど name も付けてレビュワーフレンドリー
- 変更前の値も条件に含める
- 34 -> 35になることがわかる
- 間違えていた時も戻せる
- ユーザー操作とのコンフリクトを検知
- 万が一履歴から誤爆しても更新されない(可能性が高い)
- SETとWHEREを一行にまとめてるのは変なところで小指が滑るのが怖いため
WHERE条件応用編
UPDATE
user
SET weapon_id = (SELECT id FROM weapon WHERE id = 100 AND name = '村正') WHERE
id = 1 AND
name = 'Songmu' AND
weapon_id = (SELECT id FROM weapon WHERE id = 1 AND name = '木刀')
- リレーション更新時にリレーション先のテーブルを参照する
削除編
DELETE FROM user WHERE
id = 1 AND
name = 'Songmu' AND
age = 35
考え方は同じ
- 削除前のデータを復元できるように
- セミコロンは書かない
オペレーション時の心得
GUIツールを使わない
- 賛否はありそう
- 本番の更新権限持った設定は入れない
- 意図せず本番につながってたりしたら怖い
- スキーマ情報を取るクエリを勝手にたくさん投げたりする
参照用と更新用でDBシェルに入るコマンドを分ける
- 参照用
- readonly slave
- readonly user
- 更新用
- ヒストリに書き込まない設定に
% MYSQL_HISTFILE=/dev/null mysql ...
やっておくと良い設定(mysqlの場合)
- autocommit=0
- safe-updates
TRANSACTIONを絶対に使う
BEGIN;
and COMMIT;
- autocommit=0してたとしても
BEGIN;
は打つ
- 更新クエリを打った時は更新行数を 注視 する
- 想定と異なったら、落ち着いて
ROLLBACK;
- 原因究明
- 別のところで更新された場合
- クエリが間違っている場合 (kowai)
- ちゃんと更新されてるか最後にSELECTして確認する
以上
We are Hiring
- はてなではエンジニアを募集しています
- 東京でも絶賛採用中
- もちろん京都にもおいでやす