質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Vim

VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。

Q&A

解決済

3回答

8575閲覧

mysqldumpで取得したinsert文をupdate文にしたい

takets

総合スコア43

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Vim

VimとはUnix / Linux 系のOSに標準搭載されているターミナル上で動くテキストエディタです。

0グッド

0クリップ

投稿2016/08/02 08:31

■環境
Mysql 5.6
Windows10

■質問
Mysqlのダンプファイルより、特定のテーブルの特定の項目のみを更新するために、
ダンプファイルの数千行あるINSERT文を加工してUPDATE文にしたいと考えています。

例として、以下のsqlから項目を抽出し、

sql

1INSERT INTO `testtable` VALUES (1,2,'aaa','bbb','0000-00-00','0000-00-00','1999-11-1211 16:54:29',62,'2011-11-11 15:47:25',62)

sql

1UPDATE `testtable` set name = 'aaa', text = 'bbb' WHERE id = 1;

のように加工するには、どのような方法がありますでしょうか。
vimで加工しようとしましたが、ファイルサイズが大きくて動作が重くなり、編集する前に固まってしまいます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ダンプファイルを手動で書き換えるのは、お勧めできません。

テキストエディタで開いた際にデータを壊してしまったり、
一括置換の機能を使った際に意図しない箇所まで置換してしまう可能性があるからです。

とうわけで、以下の手順で実現できないか、検討してみてください。

1 「別のDB(テーブル)」があるMySQLインスタンス内に、作業用スキーマを作成する。

sql

1mysql> CREATE DATABASE tmp;
2 作業用スキーマにダンプファイルをインポートする。
# mysql -u[ユーザー名] -p[パスワード] tmp < [ダンプファイル]
3 「別のDB(テーブル)」を更新する。

sql

1mysql> 2 UPDATE dest_db.testtable, tmp.testtable 3 SET 4 dest_db.testtable.name = tmp.testtable.name, 5 dest_db.testtable.text = tmp.testtable.text 6 WHERE dest_db.testtable.id = tmp.testtable.id

複数テーブル構文を使用している
https://dev.mysql.com/doc/refman/5.6/ja/update.html

4 作業用スキーマを削除する。

sql

1mysql > DROP DATABASE tmp;

「特定のテーブル」と「別のDB(テーブル)」がもともと同じMySQLインスタンスにあるなら、手順3 のみで実現可能です。
(SQL文内のスキーマ名(もしかしたらテーブル名も)は適宜 変更する必要がありますが)

投稿2016/08/04 06:21

KiyoshiMotoki

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

Windows10ならvimなんて使わずにもっと軽くて処理がしやすいエディタありませんか?
ちなみに取り出したデータをそのままupdateしたら更新される箇所は一つもないと思いますが
別のDBにデータを投入する処理なのでしょうか?
もしそうだとして該当するidはかならずあるのでしょうか?
つまりINSERT INTO ON DUPLICATE KEY UPDATE を使わなくてよいのか?ということ

投稿2016/08/02 08:41

yambejp

総合スコア114821

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takets

2016/08/02 08:59

ありがとうございます。 該当するidのある、別のDB(テーブル)の一部の項目を復旧することが目的です。 INSERT INTO ON DUPLICATE KEY UPDATEを使うと安全そうですね。sql文の加工が難しそうですが…
yambejp

2016/08/02 09:10

テーブルを同期したいのであればTRUNCATEしてからINSERTすればいいような気もしますが・・・
takets

2016/08/03 06:40

……本当はINSERTで済ませるのが一番とわかっていますが、上記のような方法をとらざるを得ない状況のためです。
guest

0

ベストアンサー

一番かんたんなのがINSERTをREPLACEにする
こうなります

SQL

1REPLACE INTO `testtable` VALUES (1,2,'aaa','bbb','0000-00-00','0000-00-00','1999-11-1211 16:54:29',62,'2011-11-11 15:47:25',62);

投稿2016/08/02 08:36

ToniVaquer

総合スコア146

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

takets

2016/08/02 09:00

ありがとうございます。 行頭にREPLACEを追加するだけなので、これでいけるのなら良さそうです。 試してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問