主要观点:Django 3.2 LTS 之前创建的基于 Django 的应用可能会遇到 ID 溢出问题,本文介绍了在 PostgreSQL 中重现该问题的 SQL 语句及解决步骤。
关键信息:
- Django 3.2 LTS 之前用
int
作为数据库中模型 ID 的数据类型,其范围是 0 到 2147483647,约 21 亿多记录。 - 在 PostgreSQL 中通过创建表、修改数据类型、交换表名和移动数据等步骤来解决 ID 溢出问题,如创建新表
mytable_new
并将id
数据类型改为bigint
,然后交换表名,最后移动数据。
重要细节: - PostgreSQL 对插入最大 4 字节整数表现正常,但超过最大值会报错
integer out of range
。 - 解决过程中要考虑外键引用和数据迁移等情况,如在修改表结构时要临时禁用约束,数据迁移可使用触发器或 RDMS 提供的其他功能。
- 移动数据时,若在问题发生前处理有更多时间,可研究如何同步两个表;若在问题发生后处理则需尽快复制数据,且复制速度取决于表中数据量。
结论:该问题在 Ruby on Rails 中也有出现,以前人们未预料到这种情况,如今磁盘空间利用借口已不成立,应将解决此问题列入优先级列表。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。