(MySQL - Coldfusion/Lucee) - 1つのMySQLステートメント、複数の挿入 - それぞれのsubsubCategoryIDを取得する方法?

insert関数にIDのリストを渡しています。複数の挿入を含む1つのSQL文を使用して、parentIDとサブカテゴリIDをデータベースに挿入しています。これはうまく機能します。しかし今では要求事項が変更されているので、今各インサートからいくつかの情報を取り戻す必要があります。

以下のコードを使用して、 SELECT last_insert_id()をsubsubCategoryID として追加し、クエリが最初に挿入されたレコードのみを返すようにしました)挿入ごとにサブカテゴリIDをEACHすることはできますか。それとも、挿入ステートメントをループして複数の挿入を個別の挿入ステートメントに分割する必要がありますか。

for (item in listToArray(local.formData, ",")) { 
    local.values &= "(44, " & item & "," & local.formData.userID &")," ;
}

local.values = left(local.values,len(local.values)-1) ;

local.sql = "
    INSERT INTO table (parentID, subcategoryID, userID) 
    VALUES " & local.values & "
    ; SELECT last_insert_id() as subsubCategoryID;
"
writeDump(local.sql);
2
ru de
確認してくれてありがとう。私は休憩を取り、テストされたものとしてはうまくいくという新しいアイディア(答えを見てください)を思いついて戻ってきました。
追加された 著者 HPWD,
確認してくれてありがとう。私は休憩を取り、テストされたものとしてはうまくいくという新しいアイディア(答えを見てください)を思いついて戻ってきました。
追加された 著者 HPWD,
各挿入の生成IDを取り戻すには、挿入を個別に行う必要があります。
追加された 著者 juergen d,
「そのためには、insert文をループする必要があります」AFAIK、はい。 SQL Serverや output 句のように、データベースによっては複数のidのキャプチャをサポートしていますが、MySQLがそれをサポートしているとは思いません。ただし、last_insert_id()を削除してcfqueryの result 属性を使用することができます。 IIRCは複数のIDをサポートしていませんが、それを誓うことはありません。
追加された 著者 Ageax,

4 答え

あなたはストアドプロシージャをチェックアウトする必要があります。 私はパイプ記号のような区切り文字を含むテキストのブロックを想像します。それらはバラバラにされてトランザクションの開始/コミットに挿入されます。

1
追加された

あなたはストアドプロシージャをチェックアウトする必要があります。 私はパイプ記号のような区切り文字を含むテキストのブロックを想像します。それらはバラバラにされてトランザクションの開始/コミットに挿入されます。

1
追加された

元のクエリをそのまま(subsubCategoryIDとして SELECT last_insert_id()を使わずに)にして、最後にsubsubcategoryIDを返すルックアップ(selectステートメント)を実行することにしました。これは、各挿入ステートメントの後に SELECT last_insert_id()をsubsubCategoryID として追加できるように、挿入ステートメントを分割した場合に必要となる複数のデータベース接続とは対照的に、2つのデータベース接続のみになります。

**アップデート**以下にAgeaxによるコメントに基づいて、他の誰かがこのSOに遭遇した場合の明確さのためにこのアップデートを追加しています...「最後にルックアップを実行します」と言うとき、私は最後を意味します問い合わせの終わりではなくプロセスの終わり**

1
追加された
あなたはスレッドセーフなリファレンスに良い点を作ります。私のシナリオでは幸いなことに、結果セットを挿入されたレコードだけに絞り込むことができるほど十分な詳細を知っています。
追加された 著者 HPWD,
ええ、それはトレードオフです。多くの接続、一時テーブル、または単一のルックアップ。後者の問題の1つは、スレッドセーフではないため、IDが挿入されたばかりであることが保証されていないことです。どれだけの問題がアプリによって異なります。
追加された 著者 Ageax,
複数のスレッドが同時に同じ情報を挿入すると、現在のスレッドによって挿入されたレコードと他のレコードによって挿入されたレコードを区別できなくなる可能性があります。それはいくつかのアプリでは大丈夫かもしれませんが、他のものでは非常に、非常に悪い場合があります。だからそれは言及する価値があると思いました:-)
追加された 著者 Ageax,

元のクエリをそのまま(subsubCategoryIDとして SELECT last_insert_id()を使わずに)にして、最後にsubsubcategoryIDを返すルックアップ(selectステートメント)を実行することにしました。これは、各挿入ステートメントの後に SELECT last_insert_id()をsubsubCategoryID として追加できるように、挿入ステートメントを分割した場合に必要となる複数のデータベース接続とは対照的に、2つのデータベース接続のみになります。

**アップデート**以下にAgeaxによるコメントに基づいて、他の誰かがこのSOに遭遇した場合の明確さのためにこのアップデートを追加しています...「最後にルックアップを実行します」と言うとき、私は最後を意味します問い合わせの終わりではなくプロセスの終わり**

1
追加された
あなたはスレッドセーフなリファレンスに良い点を作ります。私のシナリオでは幸いなことに、結果セットを挿入されたレコードだけに絞り込むことができるほど十分な詳細を知っています。
追加された 著者 HPWD,
ええ、それはトレードオフです。多くの接続、一時テーブル、または単一のルックアップ。後者の問題の1つは、スレッドセーフではないため、IDが挿入されたばかりであることが保証されていないことです。どれだけの問題がアプリによって異なります。
追加された 著者 Ageax,
複数のスレッドが同時に同じ情報を挿入すると、現在のスレッドによって挿入されたレコードと他のレコードによって挿入されたレコードを区別できなくなる可能性があります。それはいくつかのアプリでは大丈夫かもしれませんが、他のものでは非常に、非常に悪い場合があります。だからそれは言及する価値があると思いました:-)
追加された 著者 Ageax,