はじめに

前回、安易に使わないほうがいいLinuxコマンド"fc"を書いた。コマンドライン上で編集するときはEmacsキーバインドになるが、ヒアドキュメントなど長いコマンドを書くときにfcを使うとVimで効率よく書ける。しかしコマンド実行をキャンセルしようとした時の挙動が直感と異なるので、安易に使わない方がいいという主張だ。

全く同じようなことがMySQLクライアントコマンドでも言える。

editコマンドの良さ

mysql -u user_name -p dbnameと打ってMySQLに接続し、MySQLクライアント上で使用するコマンドラインはEmacsキーバインドになる。SQLは結合などで長くなりがちだし、適宜改行を入れた方がわかりやすい場合が多いこともあって、慣れたVimキーバインドで編集したくなるだろう。
Linuxコマンドfcと同じ役割を果たしてくれるMySQLクライアントコマンドがある。editもしくは\eだ。

editあるいは\eと打つと、ファイル名"/tmp/sqlbzVNQ2"のような一時ファイルが作られ、Viが立ち上がる。直前のSQLが元から入力済みとなっている。Viを抜けてから、;と入力すると、Viで編集したSQLが実行される。
ViではなくVimを使いたければ環境変数EDITORにvimを設定してあげる。

$ export EDITOR=vim
$ mysql -u user_name -p dbname
mysql> \e
mysql> ;

editコマンドの罠

fcと同じく注意すべきは、:q!で保存せずに抜けても元から入力済みとなっているSQLが実行されてしまうため、何も実行したくなければファイルを空っぽにしてから:wqで保存して抜けなければならないということだ。

fcと異なり、Viを抜けてからSQLが実行されるまでにMySQLクライアントのコマンドライン上で;を入力しなければならないため、一呼吸考える時間が生まれ、誤って前回打ったSQLを再実行してしまう可能性は減るだろう。またautocommitモードでなく、一時ファイル上のSQL文にcommitが含まれていない場合、誤ってDMLを実行してしまっても、すぐにキャンセルしてrollbackすれば大丈夫なので、データベースを壊してしまうことはそうそうないかもしれない。

とはいえ:q:q!を入力しているのに直前のSQLが実行されてしまうのは自分の感覚と合わないし、最悪の場合データベースを壊すようなSQLを発行しかねないので、editも安易に使わない方がいいと考える。どうしても使いたい場合は、SELECT文のみを打つ業務に限定する、read onlyのSlaveサーバへの実行だけに限定するなどルールを決めた方がいい。