2012-08-30 144 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';'來告訴它,否則它將不會工作 –