1

Zend_db_tableを使用できれば、これを行うための最良の方法を見つけようとしています。基本的に、行を挿入していますが、値の1つは同じDBからのものです。この値は常に変化するため、挿入されたデータが有効であることを確認する必要があります。2つのクエリ間でデータが変更される可能性があり、間違った値を挿入してしまうため、最初に値をクエリしてから挿入クエリに追加することはできません。テーブルをロックするのが道なのか、それともZendにショートカットがあるのだろうか。

私はMysqlを使用しています。

[編集]

例:このテーブルにはitem_numberというフィールドがあり、新しい行ごとに、最後のitem_number + 1(同じitem_familyから)を取得して挿入します。手動でインクリメントします。

 TABLE ITEMS
 | item_id |  item_family | item_number |   name    |  
 |   15    |       1      |      10     |   Pan     |
 |   16    |       2      |      1      |   Dress   |  
 |   17    |       1      |      11     |   Spoon   |

この例では、同じitem_familyの前の行が10であったため、item_family1の次の行のitem_number=11であることがわかります。

ありがとう!

4

2 に答える 2

2

私の解決策(Zendを使用)は、item_numberをクエリするのではなく、テーブルをロックし、結果を挿入クエリに追加し、テーブルを挿入してロックを解除することでした。ロックとロック解除の方法は次のとおりです。

$sql = "LOCK TABLE items WRITE";
$this->getAdapter()->query($sql);

//run select to get last item_number
//append result to insert array
//insert

$sql = "UNLOCK TABLES";
$this->getAdapter()->query($sql);

もう1つの方法は、挿入時に値が選択されるようにクエリを作成することです。次に例を示します。

$sql = INSERT INTO items (item_id, item_family, item_name, item_number) 
              VALUES (item_id, item_family, item_name, (SELECT item_number FROM... )+1);
$this->getAdapter()->query($sql);

MySQLWebでのこの種のクエリに関する詳細情報

于 2012-09-08T12:36:12.240 に答える
1

これitem_idがテーブルの主キーであり、自動インクリメントフィールドとして設定されている場合、Zend_Db_Table::insert()関数は挿入した行の主キーを返します。

$table = new Items();

$data = array(
    'item_family' => '1',
    'item_number' => '10',
    'name'        => 'Pan'
     );

$itemId = $table->insert($data); 

mysqlの最後に挿入されたid関数を直接呼び出すこともできます。

$itemId = $this->getAdapter()->lastInsertId('items');
于 2012-08-30T21:09:27.037 に答える