LoginSignup
4
3

More than 5 years have passed since last update.

mysqldumpの特定テーブルのINSERT文を1レコードずつ出力する

Last updated at Posted at 2016-12-25

環境

  • MySQL 5.6.29
  • rootパスワードなし

追記

シェルスクリプトじゃなくても、--skip-extended-insert付けるだけでよいとのこと😇

$ mysqldump -uroot -t --compact --skip-extended-insert db_name table_name
INSERT INTO `table_name` VALUES (1,'2016-12-25 12:06:19');
INSERT INTO `table_name` VALUES (2,'2016-12-25 12:06:22');
INSERT INTO `table_name` VALUES (3,'2016-12-25 12:06:22');


#!/bin/sh

DB_NAME=db_name
TABLE_NAME=table_name
for id in `mysql -uroot $DB_NAME -N -e "select id from $TABLE_NAME order by 1"`
do
  command="mysqldump -uroot -t --compact $DB_NAME $TABLE_NAME --where='id=$id'"
  eval $command
done

mysqldumpは、普通に使うとバルクインサート状態で結果を出力する。

$ mysqldump -uroot -t --compact db_name table_name
INSERT INTO `table_name` VALUES (1,'2016-12-25 12:06:19'),(2,'2016-12-25 12:06:22'),(3,'2016-12-25 12:06:22');

$ mysql -uroot db_name -e "show create table table_name\G"
*************************** 1. row ***************************
       Table: table_name
Create Table: CREATE TABLE `table_name` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4

しかし、--whereを使うと条件に合致するレコードのみ出力することが出来る。

$ mysqldump -uroot -t --compact db_name table_name --where='id=1';
INSERT INTO `table_name` VALUES (1,'2016-12-25 12:06:19');

それを利用して対象テーブルのidを昇順に取りだし、順次mysqldumpでテーブル指定して--whereに渡しているだけ。

注意点は、idを取り出すときに列名を取り出さないように-Nオプションを付けていること。これがないと、ループの初回で--where=id=idとなり、この状態だと全件バルクインサートで出力される。--where=id=0などのレコードが存在しない条件だと何も出力されないのだが、なぜか先述の場合は全件出力される。

$ mysqldump -uroot -t --compact db_name table_name --where='id=id'
INSERT INTO `table_name` VALUES (1,'2016-12-25 12:06:19'),(2,'2016-12-25 12:06:22'),(3,'2016-12-25 12:06:22');
$ mysqldump -uroot -t --compact db_name table_name --where='id=0'
$ # 出力無し
4
3
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
4
3