我如何知道某个模型的下一个免费主键?
答案 0 :(得分:18)
即使您可以查询下一个可用的主键值,它也无济于事。除非您锁定表,否则在其他数据库客户端可能为其插入操作时,您无法使用该值。
相反,您应该只插入行,然后可以查询当前会话期间生成的最新键值。每个支持自动生成主键的数据库都提供了一种方法来检索会话期间插入的最新密钥。
“会话期间”部分非常重要,因为它可以保护您的会话免受其他客户端同时执行的任何插入操作的影响。他们可以生成关键值,您的会话将继续报告最近插入的 it 的相同值。
@Stuart Childs supposes MySQL使用MAX(column_name)+1
生成下一个ID,但这是不正确的。假设您插入一行并生成ID值。但是您回滚此插入,或随后DELETE
该行。下次插入时,MySQL将生成一个全新的ID值。因此ID值比任何客户端生成的最后一个ID值大1,无论当前哪些行存储在表中。
同样,如果您插入但不立即提交。在您提交之前,其他一些客户端会执行插入操作。您的会话和其他客户端的会话都将生成自己的唯一ID值。自动生成的主键在不考虑事务隔离的情况下运行,以确保唯一性。
自动生成的主键值不会重复使用或分配给多个会话,即使您尚未提交插入内容,或者您回滚插入内容,或者删除了该行。
答案 1 :(得分:1)
- 使用Django和Mysql
next_id = Table.objects.filter(id__gt = current_id)[0] .id
答案 2 :(得分:0)
我有同样的问题,因为我复制了一个元素,我想将其pk更改为新的pk以便能够插入它。
我的解决方案如下:
import copy
objectCopy=copy.copy(object)
objectCopy.pk=None
objectCopy.save()
我的意思是,如果save()
为你做了,你为什么要手动做?
答案 3 :(得分:0)
`"interests":
[
{"Travel & Tourism": false},
{"Technology & Science" : true},
{"Restaurants": false}
]`
如果不存在,可能需要处理。
或使用最大查询数:
next_id = User.objects.order_by('-id').first().id + 1
答案 4 :(得分:-1)
我认为你必须执行一些custom SQL。您需要的SQL将是特定于数据库的。据我所知,在MySQL中没有可靠的方法来做到这一点。您可以获取最后一个插入ID,但它是特定于会话的(即,您可以获取在数据库会话中插入的最后一条记录的ID,但不能获得可能在您的会话之后发生的另一个会话的最后一个ID)。 然而(如果我错了,有人纠正我),MySQL会生成MAX(column_name)+ 1的下一个ID,所以你也可以这样做。
PostgreSQL使用sequence manipulation functions使其更容易。
编辑:
原来我在考虑multi-column key中AUTO_INCREMENT
个列,其中 是用MAX(column_name)+1生成的。但是,关键是仍然认为在插入生成之前无法检索下一个ID ,这是原始问题。
答案 5 :(得分:-1)
this 代码片段肯定会帮助您。