31
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

MySQLでSQLの結果を変数に格納する

Last updated at Posted at 2018-06-21

やりたかったこと

開発用のローカル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で実行できるので自動化できるようになりました。

31
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
19

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?