2013-08-07 99 views
-1

我知道從db table中獲取idrecordCakePHP中很容易。我想獲得一個表的「將來」record的「未來」10,即我將插入一個record,但在插入之前,我想獲得它的id,在插入完成後它將由db生成(id是int,自動遞增)。謝謝。CakePHP,從數據庫表中獲取記錄的編號

+1

爲什麼在插入之前需要知道ID?這不應該有任何需要。如果您在插入前需要ID,那麼您的編碼習慣可能不正確。 – BadHorsie

回答

1

一個選項是你可以從mysql獲取當前的最大id,然後增加值。如果您有很多操作正在進行,這可能會導致您的網站出現問題。但是,你可以使用:

$this->Model->query("SELECT MAX(id) as max FROM `your_table_name`"); 

這會讓你該表的最大ID目前那麼你可以做一個+1

另一種選擇是,以獲得ID保存後,再更新記錄用那個ID。例如cakephp爲此提供了一個方法。

$this->Model->getLastInsertID(); 
$this->Model->updateAll($fields, $conditions) 

參考updateAll:http://book.cakephp.org/2.0/en/models/saving-your-data.html#model-updateall-array-fields-array-conditions

+1

SELECT MAX不會工作。如果在您詢問的時間和您使用該ID的時間之間插入了20條記錄,該怎麼辦? – RichardAtHome

+0

是的,我想到了第一個想法,但我不知道它可能會導致一些麻煩。爲什麼它可能會造成麻煩?你能解釋我嗎?而且,在插入之前CakePHP沒有任何功能或東西給我最後一個ID嗎? CakePHP不是以任何簡單的方式支持這種操作嗎?@Sixthpoint – user2387319

+0

像下面解釋的那樣,其他操作在您使用剛插入的ID之前發生。我不知道你會使用它的上下文。插入之前獲取ID的最佳做法並不是真的。但是,如果您沒有其他選項,則應該鎖定表以便不發生其他事務:http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html – Sixthpoint

4

即使數據庫本身並不知道ID它要使用,直到那一刻保存記錄後。

您不能(在多用戶系統中)事先詢問該ID將會是什麼,因爲在詢問該ID將要發生的時間與您的時間之間可能插入了20個其他記錄插入您的記錄(使用20個記錄之前使用的ID)。這稱爲「競爭條件」。

這裏會發生什麼:

You: DB - what's the next ID please? 
DB: (Does a max() on the column) 21! 
You: Great! I'll use that! 

(meanwhile 20 other records get inserted by other users) 

You: Hi DB, I'd like to insert this record using ID 21 like you told me! 
DB: Oops - sorry - that ID has already been used :'-(

你不需要提前知道的紀錄。如果您正確構造保存數據並使用CakePHP的saveAccociated()方法,則CakePHP將插入正確的ID作爲所有相關數據的外鍵值。

有一個可預測的ID的唯一方法是自己創建它。請記住 - 它必須是非空且唯一的(主鍵的定義)。

爲自己節省很多未來的主鍵衝突並堅持蛋糕的方法:-)

相關問題