人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

MySQL Ver5 の質問です。
INSERT を行う際に、結合は使えますか?
また、使えたとしたら以下の処理はどのように行いますか?


以下、2つのテーブルの結合を行い、配列の値を INSERT する。
テーブル名:a_tb
フィールド名:aa_id, aa_name
pkは 'aa_id' でAUTO_INCREMENT

テーブル名:b_tb
フィールド名:cc_id, aa_id, user_id
pkは 'cc_id' と 'aa_id'

配列名:xx_array
cc_id, aa_name, user_id、以上3っつ値は配列で準備されています。
'a_tb' の 'aa_id' の連番の同じ値を 'b_tb' にも結合で挿入したいと考えています。
つまり、 'b_tb' はジョイントテーブルです。

ネット検索しましたが、今一イメージがつかめません。
具体的なアドバイスを、よろしくお願いします。

●質問者: seadwell
●カテゴリ:ウェブ制作
✍キーワード:MySQL PK かめ アドバイス イメージ
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● chuken_kenkou
●35ポイント

NSERT を行う際に、結合は使えますか?

使えます。

SQL例を示すと、こんな感じ。

insert into t1(c1,c2,c3,c4)
 select t2.c1,t3.c2,current_date,null
 from t2,t3
 where t2.c1=t3.c1

配列の値を INSERT

配列名:xx_array

cc_id, aa_name, user_id、以上3っつ値は配列で準備されています。


配列って、phpか何かのアプリの話ですよね?

MySQLには、列のデータ型で、配列は未実装ですから。

出力(insert)するのは、b_tbなのですよね?

入力は、a_tbとアプリ中の配列?

◎質問者からの返答

説明不足スミマセン。

配列はPHPで作成してあります。

PHPで作成した配列を出力します。

出力は、b_tbとa_tbを結合したものに出力できないのか?と考えました。

先ほどから、出来ない気がしているのですが・・・。

配列xx_arrayの値を、b_tbとa_tbに出力するには、まず、a_tbに配列xx_arrayをinsertして、a_tbのaa_idに連番が振られてから、再度a_tbを読みにいき、連番を取得して、b_tbを書き込みに行かなければならないのか?

もっと効率的な方法は無いのか?

と思ったしだいです。


2 ● chuken_kenkou
●35ポイント

1個のINSERT文で、複数のテーブルへのINSERTは行えません。

Oracleだったか、そういう独自機能がありますが、標準SQLや他の主要なRDBMSでは、そういった機能はありません。

「a_tbとb_tbを、同期を取って操作しなければならない」とのことなので、トランザクション(複数の更新操作を行った場合、一連の更新すべてを有効にするか、無効にする。一部だけ有効といった中途半端な状態にしない)を使うか、MySQL 5.0以降とのことなので、ストアドプロシジャでの実装が考えられます。

なお、MySQLのトランザクションは、InnoDBが前提といった制限があります。

手順としては、

  1. a_tbに1行格納
  2. b_tbに1行格納。

この時、a_tbのaa_idは、last_insert_id()で得るか、a_tbを検索する。

→複数ユーザからのinsertがある場合、a_tbを検索するのに、どの行が対象かを識別する方法が必要になります。

◎質問者からの返答

なるほど。

ご親切にありがとうございます。

できないと言うことがわかっただけでも余計なことを考えないで済みます。


トランザクションとlast_insert_id()を合わせ使った方法を試してみたいと思います。

ありがとうございました。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ