VALUES
準備されたDBIステートメントを介して1つ以上のセットを挿入する動的SQLステートメントを作成しています。私の質問は次のとおりです。
セットの数は動的であり、プレースホルダーとバインド値を使用して1つのクエリのみを送信するには、ステートメントを拡張するために必要なVALUES
数などを追加する必要があるため、これが推奨される方法です(最も効率的な方法など)。効率の背後にある推論は、可能であればあなたの答えに役立つでしょう)または私はこれをとでクエリ文字列として構築する必要がありますか?( ?, ?, ?),( ?, ?, ?)
INSERT INTO `tblname` ( $columnsString ) VALUES
sprintf
dbh->quote()
(少し追加情報として:私は現在AnyEvent :: DBIを使用しています。これはプレースホルダーとバインド値のみを公開し、メソッドは公開しないため、別のストレートDBIを作成して別のデータベースを使用しquote()
ないと簡単に実現できません。メソッドを使用するためだけに、またはAnyEvent :: DBIモジュールを自分で変更せず$dbh
にサーバーに接続します。)quote()
通常は必要に応じてステートメントを実行しますが、この重いワークロードの場合は、DBの効率を上げるために、挿入をまとめてバッチ処理しようとしています。
また、可能であれば(そしてその方法で)誰かが答えることができれば、DEFAULT
プレースホルダーを使用してSQL値を挿入し、すばらしい値をバインドします。通常、これを行う必要がある場合はDEFAULT
、文字列にsを直接追加し、sprintfを$dbh->quote()
非DEFAULT
値にのみ使用します。
アップデート:
簡単なチャットで誤解を解きました。ユーザーikegamiは、プレースホルダーなしでクエリ文字列を自分で作成するのではなく、VALUESと次のようなプレースホルダーを混在させることを提案しました。
$queryString .= '(DEFAULT,?,?),(DEFAULT,DEFAULT,DEFAULT)';
SOに関するこの質問の最初の質問の背後にある理由のいくつかは、SQL'DEFAULT'がプレースホルダーバインドに含まれないことが保証された後、コードが読みにくくなると考えたため、この混合にいくらか反対したためです。価値、これは私が実装し始めた方法でした。
可能な場合はプレースホルダーを使用する方がクエリを作成する方法として受け入れられているようです。SQLDEFAULT
が必要な場合は、プレースホルダーと同じクエリ作成に含める必要があります。NULL
プレースホルダーとバインド値を使用して値を挿入できるため、これは値には適用されませんundef
。
アップデート2:
パフォーマンス、quote()を使用した独自のクエリの作成とプレースホルダーを使用した作成の「受け入れ」、およびSQLにすべての列を使用するソリューションを採用したINSERT INTO tblname (cols)
理由は、およそ2〜4個あるためです。 1日に100万行がひどいデータベースサーバーに入り、私のコードは同じようにひどいサーバーで実行されています。SQL値が必要であるという要件とDEFAULT
、これらのひどいパフォーマンスの制約から、今のところソリューションを選択しました。
これに遭遇する将来の開発者のために-SQL::Abstractを使用する@emazepのソリューションを見てください。または、何らかの理由で独自のソリューションを構築する必要がある場合は、@ Schwernのサブルーチンソリューションを使用するか、@ikegamiのソリューションを組み込むことを検討してください。これらはすべて、DBIの使用法と動的クエリの構築に関する「現状」に関する優れた回答であるため、それに答えてください。