やりたかったこと
開発用のローカルDBを作るのに本番DBからのダンプデータを使いたい。
ただし全件ではデータが膨大でマスク処理やリストアに時間が掛かるので、直近登録の1000件のユーザを除いて古いユーザデータを削除したい。
どうやったか
直近1000件のユーザIDを取得して関連データを削除する。
set構文
最初はset構文を使い手動でid降順で1000件目のidを変数へ代入していました。
> select MIN(id) from (select id from users order by id desc limit 1000) hoge;
+---------+
| MIN(id) |
+---------+
| 4001 |
+---------+
> SET @min_user_id = 4001;
この方法だと毎回1000件目のidを調べてから手動でSQLを書き換える必要があったので面倒くさい
SQLの結果を格納
SELECT句の中で代入式を書くとその結果を変数に格納して利用できます。
> SELECT @min_user_id := `id` FROM users ORDER BY id DESC LIMIT 1000;
+----------------------+
| @min_user_id := `id` |
+----------------------+
| 5000 |
| 4999 |
.
.
.
| 4002 |
| 4001 |
+----------------------+
1000 rows in set (0.00 sec)
> select @min_user_id;
+--------------+
| @min_user_id |
+--------------+
| 4001 |
+--------------+
1 row in set (0.00 sec)
> DELETE from users where id < @min_user_id
Query OK, 4000 row affected (0.00 sec)
これで毎回同じSQLで実行できるので自動化できるようになりました。