我有一个 Django 应用程序,它使用 PostgreSQL 来分析来自推文的数据。每个请求都会使数据集增加数千条记录。我主要将数据库用作缓存,因此我计划每 24 小时删除一次所有记录以允许新请求,而不会不必要地增加数据库的大小。
Django 使用SERIAL
类型来存储 id;新项目被赋予上一个项目的下一个最高值,而不是第一个可用的数字。我不会将 ID 用于 ORM 之外的任何内容。我担心我的 32 位 VM 上的密钥空间最终会用完。当下一个值太大时,PostgreSQL 会做SERIAL
什么?它给出错误吗?它会回滚到一个吗?
TLDR:如果您要拥有超过 2 31个可能的值,请将列类型更改为
BIGSERIAL
.说明:
该
SERIAL
类型是带符号的 32 位整数,设计用于小于 2 31的值(注意:这是 2 31,而不是 2 32,因为它们是有符号整数)。这是 PostgreSQL 文档的片段:文档中没有提到它如何处理超过 2 31的溢出行为,但它明确指出,如果您希望有大于该值的值,则不应使用它。
SERIAL
列是序列号。服务器跟踪先前的值(先前的最大值),每次请求一个值时,该值都会增加。无论 id 是否实际永久保存,这种增量都可能发生。如果获取 id 的事务被回滚,那么 id 将“丢失”,并且您的序列中将有漏洞(例如,未使用的 id 的间隙)。这没有什么问题,如果您只是将它们用作唯一 ID,那么有间隙应该不会造成问题。像这样实现序列以提高效率。服务器只需要跟踪一个值(先前的最大值)来唯一生成 id,它可以跨多个连接缓存它们以加速序列生成,并且通过允许间隙,它在生成序列时永远不需要事务锁定序列对象. 这使得它们非常高效和并发。
只需将您的数据库表切换为使用
BIGSERIAL
.