我知道从id
中的record
获取db table
的{{1}}非常简单。我希望得到一个表的“未来”CakePHP
的“未来”id
,也就是说,我会插入一个record
,但在插入之前,我想得到它id,将在插入完成后由db生成(record
为int,Auto Increment)。感谢。
答案 0 :(得分: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的唯一方法是自己创建它。记住 - 它必须是非null且唯一的(主键的定义)。
保存自己许多未来的主键冲突并坚持蛋糕方法: - )
答案 1 :(得分: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