Zend Db / Mysql - 使用Select插入

时间:2012-08-30 17:32:31

标签: mysql zend-framework zend-db

我正在尝试找到最佳方法,如果我可以使用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。

谢谢!

2 个答案:

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

有关MySQL Web

中此类查询的详细信息

答案 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');