我正在尝试找到最佳方法,如果我可以使用Zend_db_table,那就更好了。 基本上我插入一行,其中一个值来自同一个DB,这个值不断变化所以我需要确保插入的数据是有效的。 我不能先查询该值,然后将其附加到插入查询,因为在两个查询之间数据可能会更改,我最终会插入错误的值。我想知道锁定表是否可行,或者Zend是否有快捷方式。
我正在使用Mysql。
[EDITED]
例如:这个表有一个名为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。
谢谢!
答案 0 :(得分:2)
我的解决方案(使用Zend)是锁定表,而不是查询item_number,将结果追加到插入查询,插入和解锁表。以下是LOCK和UNLOCK的方法:
$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);
中此类查询的详细信息
答案 1 :(得分: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');