1

我正在尝试找到最好的方法来做到这一点,如果我可以使用 Zend_db_table 会更好。基本上我插入一行,其中一个值来自同一个数据库,这个值不断变化,所以我需要确保插入的数据是有效的。我不能先查询该值,然后将其附加到插入查询,因为在两个查询之间数据可能会发生变化,我最终会插入错误的值。我想知道锁定表是否是要走的路,或者 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 1 的下一行的 item_number = 11,因为同一 item_family 的前一行是 10。

谢谢!

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);

另一种方法是编写查询,以便在插入期间选择值。这是一个例子:

$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);

有关MySQL Web中此类查询的更多信息

于 2012-09-08T12:36:12.240 回答
1

Provided that item_id is the primary key of your table, and it set as auto increment field, the Zend_Db_Table::insert() function will return the primary key of the row just you inserted.

For example:

$table = new Items();

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

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

You can also call directly the mysql last inserted id function:

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