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

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

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

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

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

解決済

1回答

1515閲覧

postgresqlからmysqlに大量のテーブル内データをupsertしたい(laravel)

YKita

総合スコア2

MySQL

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

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2021/10/16 04:08

前提:
laravel 5.5

読み取り専用のpostgresqlから、mysqlのテーブルにデータをupsertしたいです。
postgresqlにはsqlを発行することができますが、updateやinsertなどはできません。

postgresqlのテーブル名 = table1
mysqlのテーブル名 = table2
であり、それぞれのテーブルに紐づいたeloquantモデルがlaravelプロジェクト内に存在します。

postgresqlのカラム名はcolumn1, column2, column3で
mysqlのカラム名はid, column_no1, column_no2, karamu3
のように、カラム名がそれぞれ異なります。
また、postgresql側にはidがありません。

upsertしたいレコードの数は100万程度となっています。
現状思いついているのは

  1. クエリビルダでtable1のデータをchunk(1000件)で取得する。
  2. 1000件に対して一つずつupdateOrCreateで存在を確認し、table2に代入する。

なのですが、結局2においてクエリが1000件*160=160万回飛ぶため実行時間が長くなっています。
可能であれば、1回のクエリで1000件のデータに対して存在するかどうか確認し、バルクインサートを行いたいです。

どのようにすれば良いでしょうか。回答よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

postgres からCOPYでCSV出力して、そのファイルをMySQLにLOAD DATA INFILEで取り込むのが素直だと思います。

投稿2021/10/16 04:25

sazi

総合スコア25206

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

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

YKita

2021/10/16 06:20

回答ありがとうございます。 upsertを行いたいので、今回の状況を踏まえると 何らかのクエリでid採番を行ってからCOPYでcsv出力→LOAD DATA INFILE REPLACEとすれば良いのではないかと考えましたが、id採番をメモリ負荷すくなく行う方法はご存知でしょうか?
sazi

2021/10/16 09:30 編集

mysqlのidがプライマリーでupsertしたいなら、当然LOAD DATA INFILEする以前に加工しないと駄目ですね。 copyではselectを元に出来ますから、ID採番のルールを組み込めるなら、SQLでID採番すれば良いかと思います。 ID採番がMySQL側で行う方がやり易いなら、CSVを一旦別テーブルに取り込んでから加工の方が良いでしょうね。
YKita

2021/10/19 14:18

確かにおっしゃる通りですね。行ってみます。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問