sql >> データベース >  >> RDS >> Mysql

Zend_Dbで複数の行を追加するにはどうすればよいですか?

    Zend_Dbが複数行の挿入をサポートしているとは思いません。

    ただし、行が2つ以上ある場合は、ループを使用できます。

    foreach ($data as $row)
    {
        $db->insert('table', $row)
    }
    

    ビル・カーウィン 、元Zend Framework開発者は、これは少し前のNabbleで

    行セットは基本的にコレクションオブジェクトであるため、そのクラスにメソッドを追加して、行をセットに追加できるようにします。したがって、これを実行できるはずです:

    // creates a rowset collection with zero rows
    $rowset = $table->createRowset();
    
    // creates one row with unset values 
    $row = $table->createRow();
    
    // adds one row to the rowset 
    $rowset->addRow($row); 
    
    // iterates over the set of rows, calling save() on each row
    $rowset->save(); 
    

    createRowset()に整数を渡してN個の空の行を作成することは意味がありません。とにかく値を入力するには、それらを反復処理する必要があります。したがって、ループを作成して個々の行を作成し、アプリケーションデータを入力してから、それらをコレクションに追加することもできます。

    $rowset = $table->createRowset();
    foreach ($appData as $tuple) 
    {
        $row = $table->createRow($tuple);
        $rowset->addRow($row);
    }
    $rowset->save();
    

    配列の配列をcreateRowset()に渡すことを許可することは理にかなっています。これは、タプルをcreateRow()に渡す使用法と一致するためです。

    $rowset = $table->createRowset($appData); // pass array of tuples
    

    これにより、上記の前の例と同じループが実行され(最後のsave()を除く)、save()dの準備ができた新しい行の新しい行セットが作成されます。

    SQLには、データ挿入の効率を向上させる2つの方法があります。

    1. 複数の行を持つ単一のINSERTステートメントを使用します:

      INSERT INTO t(col1、col2、col3)VALUES(1、2、3)、(4、5、6)、(7、8、9);

    2. INSERTステートメントを準備し、それを複数回実行します:

      PREPARE INSERT INTO t(col1、col2、col3)VALUES(?、?、?); EXECUTE 1、2、3EXECUTE 4、5、6EXECUTE 7、8、9

    ただし、これらの改善のいずれかをサポートすると、RowクラスとRowsetクラスが複雑になります。これは、現在のZend_Db_Table_Rowクラスが、save()を呼び出すときにINSERTまたはUPDATEが必要な行を区別する内部的な方法によるものです。この区別はRowオブジェクトによってカプセル化されるため、Rowsetは、個々の行が新しい行であるか、既存の行の変更されたコピーであるかを認識しません。したがって、Rowsetクラスがより効率的なSQLを使用する複数行のsave()メソッドを提供するには、ダーティデータの管理を完全にリファクタリングする必要があります。より簡単な解決策は、行セットがその行を反復処理し、各行でsave()を呼び出すことです。これは、行セットを挿入するためのSQLの最適化には役立ちませんが、OOカプセル化には適しています。

    いずれにせよ、効率的なSQLが最も必要な場合、通常のWebリクエストで多くの行のデータを一括ロードすることは非常にまれです。少数の行の効率の違いは小さいため、大量の行を一括ロードする場合にのみ、顕著な改善が見られます。その場合は、とにかくINSERTを使用しないでください。また、MySQLのLOAD DATAステートメントを使用するか、別のRDBMSブランドを使用する場合は同等の機能を使用する必要があります。 INSERTは通常、大量のデータをロードするための最も効率的な選択ではありません。

    自動生成されたキーを返すことに関しては、私は気にしません。プレーンSQLを使用し(たとえば、mysql CLIで)、単一のINSERTステートメントに複数の行を挿入する場合、挿入されたすべての行のID値ではなく、最後に生成されたID値のみを取得できることに注意してください。これはSQLの動作です。これは、どの言語やフレームワークにも当てはまります。

    INSERT INTO t (col1, col2, col3) VALUES (1, 2, 3), (4, 5, 6), (7, 8, 9);
    SELECT LAST_INSERT_ID(); -- returns only the id for the third tuple
    

    各行のIDが必要な場合は、ループを作成して行を1つずつ挿入し、各行が挿入された後に生成されたIDを取得する必要があります。



    1. ステップバイステップR12.2.6VirtualBoxへのEBSのインストール

    2. Oracle sqlでの%Typeの意味は何ですか?

    3. SELECT FORXMLAUTOおよび戻りデータ型

    4. read()を呼び出す前にフィールドにアクセスしようとする試みが無効です