-1

我知道从 a中得到ida很容易。我想得到一个表的一个“未来”的“未来” ,也就是我会插入一个,但是在插入之前,我想得到它的id,插入完成后由db生成(即int,自动增量)。谢谢。recorddb tableCakePHPidrecordrecordid

4

2 回答 2

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 的唯一方法是自己创建它。请记住 - 它必须是非空且唯一的(主键的定义)。

为自己节省很多很多未来的主键冲突并坚持使用蛋糕方法:-)

于 2013-08-07T15:12:52.107 回答
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

于 2013-08-07T14:56:10.070 回答