2012-08-30 67 views
1

我想找到最好的方法来做到这一点,如果我可以使用Zend_db_table,我会更好。 基本上我插入一行,其中一个值来自同一个数据库,这个值不断变化,所以我需要确保插入的数据是有效的。 我无法首先查询该值,然后将其附加到插入查询,因为在两次查询之间数据可能会更改,并最终插入错误的值。我想知道是否要锁定桌子,或者Zend是否有捷径。Zend Db/Mysql - 插入选择

我正在使用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

信息你能解释一下吗?这听起来有点奇怪 - 你的价值观不断变化,但你不能阅读它们,因为它然后又改变了?那么如果你不能以一种合理的方式使用它,首先它会改变什么呢? –

+0

解释了webnet。谢谢。 – Bema

+0

这是你的设计有问题。为什么你不为'item_number'值使用'autoincrement'而不是自己做这个? –

回答

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

另一种方法是编写查询,以便价值将durint插入进行选择。这里有一个例子:

$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

假设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'); 
+2

'假设item_id是主键'需要注意Zend_Db希望'id'是主id,除非您在模型中明确地通过声明'protected $ _primary ='item_id';'来告诉它,否则它将不会工作 –