我怎么知道某个模型的下一个免费主键?
即使您可以查询下一个可用的主键值,它也无济于事.除非您锁定表,否则在其他数据库客户端可能为其插入获取它之前,您不能使用该值.
相反,您应该只插入行,然后查询当前会话期间生成的最新键值.每个支持自动生成主键的数据库都提供了一种方法来检索会话期间插入的最新密钥.
"在您的会话期间"部分很重要,因为它可以保护您的会话免受其他客户端同时执行的任何插入.他们可以生成键值和您的会议将继续报告相同的值它插入最近.
@Stuart Childs 假设 MySQL生成下一个ID,MAX(column_name)+1
但这是不正确的.假设您插入一行并生成ID值.但是您回滚此插入,或随后回滚该DELETE
行.下次插入时,MySQL将生成一个全新的ID值.因此ID值比任何客户端生成的最后一个ID值大1 ,无论表中当前存储的是哪些行.
同样,如果您插入但不立即提交.在您提交之前,其他一些客户端会执行插入操作.您的会话和其他客户端的会话都将生成自己的唯一ID值.自动生成的主键在不考虑事务隔离的情况下运行,以确保唯一性.
即使您尚未提交插入,或者回滚插入,或者删除了行,自动生成的主键值也不会重复使用或分配给多个会话.