![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
MySQLから取得した値を加工して、別のMySQLへ挿入したいのですが、
どうすればよいでしょうか?
例えば、リンク先の$row["Name"]に「さん」を付与して、別のDBへ挿入したい場合
▽PHP: mysqli_result::fetch_assoc - Manual
http://www.php.net/manual/ja/mysqli-result.fetch …
例1 オブジェクト指向型を参考に、連想配列を取得するところまでは出来たのですが、
この後、どうすればよいでしょうか?
■分からないこと1
・連想配列で取得したデータを、$mysqli->close();した後でも利用するにはどうすれば良いでしょうか?
whileの中で、
$data["Name"]=$row["Name"];
$data["CountryCode"])=$row["CountryCode"]);
とやると1件しか取得できません。
whileの中で、
$data["Name"].=$row["Name"];
$data["CountryCode"]).=$row["CountryCode"]);
とやると、ちょっとイメージと異なる配列になります。
■分からないこと2
$mysqli->close();した後、$newmysqli = = new mysqli("localhost", "my_user", "my_password", "world");を書いて、もう一度同じようなことをやる感じなのでしょうか?
一回、閉じてから、新しいDBへ接続する流れなのでしょうか?
No.5ベストアンサー
- 回答日時:
すみません、もしOLDTABLE側のカラム値がint型、bigint型などの
数値型であるとおっしゃっており、時分秒まで格納されていた場合は
以下になります。
INSERT INTO NEWDB.NEWTABLE (
NAME, CREATED
)
SELECT CONCAT(NAME, 'さん'),
DATE_FORMAT(CREATED, '%Y-%m-%d %H:%i:%s')
FROM OLDDB.OLDTABLE
実行結果はこんな感じになるでしょう。
mysql> use olddb;
Database changed
mysql> select * from oldtable;
+--------+----------------+
| name | created |
+--------+----------------+
| テスト | 20120810122334 |
+--------+----------------+
1 row in set (0.01 sec)
mysql> use newdb;
Database changed
mysql> select * from newtable;
Empty set (0.00 sec)
mysql> INSERT INTO NEWDB.NEWTABLE (
-> NAME, CREATED
-> )
-> SELECT CONCAT(NAME, 'さん'),
-> DATE_FORMAT(CREATED, '%Y-%m-%d %H:%i:%s')
-> FROM OLDDB.OLDTABLE;
Query OK, 1 row affected (0.01 sec)
Records: 1 Duplicates: 0 Warnings: 0
mysql> select * from newtable;
+------------+---------------------+
| name | created |
+------------+---------------------+
| テストさん | 2012-08-10 12:23:34 |
+------------+---------------------+
1 row in set (0.00 sec)
No.3
- 回答日時:
> $data[] = $row;としました
なるほどなるほど、それなら、まぁありっちゃありですね。
その分メモリを食うわけですが。
> 違うDBへ接続する時は、具体的に、どうなるのでしょうか?
$res1 = mysqli_connect($host1, $user1, $pass1); //これは接続先1のリソース
$res2 = mysqli_connect($host2, $user2, $pass2); //これは接続先2のリソース
接続リソースごとにSQLを発行したりcloseすればよいです。
mysqli_query()のSQL発行命令は、上記で取得した
接続リソースを引数に指定して発行します。
同様にフェッチする命令も、mysqli_query()からの
戻り値であるリソースを引数に指定してフェッチします。
DB間のデータ移動については、具体例が#2で挙がっているので、その通りにすればよいです。
移動先DBに接続して、移動先DBでSQLを発行すればよいです。
当然、同一DBサーバ内であることと、移動元、移動先ともに適切なアクセス権限が
なければなりませんが。
ここの手順の3つ目がまさにそれです。
http://tagajo.blogspot.jp/2010/12/mysql.html
DBサーバが分かれていたり、あくまでPHPスクリプトを介して処理したい
場合は手順はこんな感じです。
1.移動元DBに接続
2.移動先DBに接続
3.移動元DBへSELECT発行
※ここ繰り返し
3-1.結果をフェッチ
3-2.フェッチしたデータを加工
3-3.移動先DBへINSERT発行
4.移動元DBを切断
5.移動先DBを切断
元々のやり方だと$data[]分をINSERT時に更にループしなければならないので、とても非効率です。
とはいえ、上記方法も何回もSQLを発行するしPHPスクリプトが密に絡むので、圧倒的に遅いです。
DBサーバが分かれている場合は、DBリンクの機能もMySQL5.0くらいから
あるようですが、私は使ったことがありません。
それが出来るようなら、DBサーバが分かれていたとしても、SQL発行だけで済むでしょう。
http://dev.mysql.com/doc/refman/5.1/ja/federated …
この回答への補足
回答ありがとうございます。
PHPスクリプトを介する処理を丁寧に解説いただき(サンプルリンク先まで探していただき)、大変参考になりました。
また、今回のケースでは、SQLで処理可能だということも分かりました。
現状、「3-2.フェッチしたデータを加工」まで出来、後は「3-3.移動先DBへINSERT発行」するだけのところまで来たので、
今度は、PHPを介さない処理にも挑戦しているのですが、ちょっと詰まってしまいました。
2さんの補足に記入したのですが、
何か気がついた点等あれば、アドバイスよろしくお願いします
No.2
- 回答日時:
先の回答の補足を読んでの回答になります。
SQL文のみで行うことが望ましいと思います。
INSERT INTO `NEW_DB`.`NEW_TABLE`
SELECT
CONCAT(`name`, 'さん')
, DATE_FORMAT(`timestamp`, '%Y-%m-%d %H:%M-%s')
FROM `OLD_DB`.`OLD_TABLE`
こんな風にMySQLの関数を使えば、間違いも起きません。
PHPを通すと、タイムアウトを考慮したり、なにかと面倒です。
この回答への補足
回答ありがとうございます。
早速試してみたのですが、異なるDB間だと、環境的にエラーになりました(ユーザー権限?)
#1142 - SELECT command denied to user '○○'@'localhost' for table '△△'
そこで、DUMPテーブルデータをインポートして、同じDB内で処理すればいいかな、と思ったので、その辺りについて教えてください。
■最終的にやりたいこと
・元テーブル「created」カラムでint保存しているタイムスタンプを、新テーブルではdatetime型カラムへ変換したい
■試したこと
INSERT INTO `NEW_TABLE` ( created )
SELECT DATE_FORMAT( `created` , '%Y-%m-%d %H:%M-%s' )
FROM `OLD_TABLE`( created )
としたら、
>43 行挿入しました。
>id 227 の行を挿入しました ( クエリの実行時間 0.0028 秒 )
と表示はされるのですが、実際には、「created」カラムの中身はNULLになってしまいます。
■手順
・元テーブルのDUMPデータを、DBにインポートした後、どうすれば良いのでしょうか?
・まず初めに、新テーブルを作成するのでしょうか?
・そして、新テーブルの「created」カラムを、intからdatetime型へ変換(この時点で、データがnull)?
・最後に、INSERT INTO~SQL文を実行? それとも、UPDATE文の方がいいのでしょうか?
No.1
- 回答日時:
> MySQLから取得した値を加工して、別のMySQLへ挿入したいのですが
DBから抽出して$row["Name"]を取得しているのですか?
1.
ちょっとMySQLがどうだったか試したことなくて試す環境もなくて
分かりませんが、一般的に、DB接続をcloseしたあとにフェッチは
できないので、そもそもがおかしいです。
2.
DB接続をcloseしたあとは再度接続しなくてはなりません。
そもそもcloseせず、続けてSQLを発行し、処理が完全に終わったら
終了すればいいです。
特別な理由がない限り、いちいちcloseする必要はありません。
しかしながら、DBからDBへ、ならば、
INSERT INTO TBLA (
Name, COL2, COL3
)
SELECT
concat(Name, 'さん'),
COL1,
COL2
FROM
TBLB
WHERE
COL2 = うんたらかんたら;
という方法も考慮してはいかがでしょうか?
この回答への補足
回答ありがとうございました。
>DBから抽出して$row["Name"]を取得しているのですか?
はい
>1.
>一般的に、DB接続をcloseしたあとにフェッチはできない
DB接続をcloseしたあとに変数として保持したかったので、
$data[] = $row;としました
>2.
>DB接続をcloseしたあとは再度接続しなくてはなりません。
>そもそもcloseせず、続けてSQLを発行し、処理が完全に終わったら終了すればいいです。
違うDBへ接続する時は、具体的に、どうなるのでしょうか?
$newmysqli = = new mysqli(部分は、インスタンスを生成している(?)ので、ここで接続しているということなのでしょうか?
>しかしながら、DBからDBへ、ならば
質問がややこしくなりそうだったので、【row["Name"]に「さん」を付与して】と書いたのですが、
本当にやりたいことは、intで保存しているタイムスタンプを
date("Y-m-d H:i:s", $created)
とかで変換して、別DBのdatetime型カラムへ挿入したいのです。
(最終的にやりたいのは、異なるDB構成へのデータ移行です)
DBからデータ取得して、データを一部PHPで加工して、異なるDBへ挿入したいのですが、
どういう手順で行なえば良いのでしょうか?
■現状
・旧DBよりデータ取得
・多次元配列でデータを取得
while ($row = $result->fetch_assoc()) {
$data[] = $row;
・この多次元配列のデータを一部加工して、別DBへ突っ込みたいのですが、
多次元配列のデータ配列の一部を加工して、戻す方法がよく分かりません。
DBからデータ取得して、データを一部PHPで加工して、異なるDBへ挿入しているような、簡単なサンプル、どこかにないでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP PHP MySQLに画像を直接保存 2 2022/06/05 11:50
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- JavaScript gasについて 1 2022/05/31 21:51
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
- PHP PHP MySql 画像を取得 1 2022/06/04 14:05
- その他(プログラミング・Web制作) pythonでDBのカラム名で取得したオブジェクトの値を表示したい 1 2022/05/13 03:41
- PHP PHP MySql ページング 2 2022/09/20 06:38
- PHP 【PHP/MySQL】コード上で生成したクエリを基に集計クエリを作りたい 1 2022/07/28 15:06
- PHP PHPSpreadsheetによる書き出し時のページネーション方法について 1 2023/03/20 10:35
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ACCESSとXサーバーをODBCで接続...
-
ログイン履歴について
-
ローカル以外のMySQLをphpMyAdm...
-
MySQL sleep が溜まる
-
perlのDBIからmysqlにINSERTINT...
-
接続ができません
-
副問合せにLIKE文を使う方法は...
-
MySQLカラム名は日本語と英数字...
-
SQLのVARCHARとVARCHAR2の違い
-
Column '' not found.
-
ODP.NETのバージョン確認
-
MySQLのテーブル作成でハイフン...
-
mysqlへのインポート処理がうま...
-
like句を使って日本語を検索す...
-
mysqldが実行できない
-
プライマリーキーの昇順でソー...
-
Excel VBA SelectedItems
-
参考書に従って入力したつもり...
-
RPMのmysqlとmysql-serverの違い
-
DB2 INSERT時の格納順序
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
MySQLにリモートホストから接続...
-
ポート3306へつながらず、MySQL...
-
MySQL sleep が溜まる
-
mysql_close();の必要性について
-
ローカル以外のMySQLをphpMyAdm...
-
ACCESSとXサーバーをODBCで接続...
-
perlのDBIからmysqlにINSERTINT...
-
DBから取得した値を加工して別...
-
クエリー実行中に強制終了した場合
-
mySQLでエラーが出ます。
-
MySQLでエラーがでて前に進めま...
-
ログイン履歴について
-
外部からのMYSQLへの接続方法と...
-
cseの使い方について
-
XAMPPのMySQLを外部から接続で...
-
MySQLの外部ホストのデータベー...
-
ブラウザからの接続
-
xamppのphpmyadminに入れない
-
win7でphpMyAdminが使えない?
-
Mysqlのサーバーを立ち上げる方法
おすすめ情報