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' はジョイントテーブルです。

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

回答の条件
  • 1人2回まで
  • 登録:2008/11/13 16:06:29
  • 終了:2008/11/13 18:29:57

回答(2件)

id:chuken_kenkou No.1

chuken_kenkou回答回数722ベストアンサー獲得回数542008/11/13 16:44:37

ポイント35pt

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とアプリ中の配列?

id:seadwell

説明不足スミマセン。

配列は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を書き込みに行かなければならないのか?

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

と思ったしだいです。

2008/11/13 17:03:00
id:chuken_kenkou No.2

chuken_kenkou回答回数722ベストアンサー獲得回数542008/11/13 17:29:17

ポイント35pt

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を検索するのに、どの行が対象かを識別する方法が必要になります。

id:seadwell

なるほど。

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

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


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

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

2008/11/13 18:29:40

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません