PostgreSQL迁移旧库数据至新库后ID冲突问题(Django项目)
解决Django迁移数据后主键自增起始值问题
迁移带主键ID的旧数据到新数据库后,数据库的自增计数器未同步到最后一个ID,导致新增对象时出现ID冲突。以下按不同数据库类型给出解决步骤:
PostgreSQL
- 查询目标表的最大主键ID:
SELECT MAX(id) FROM your_app_yourmodel;
- 获取表对应的自增序列名(Django默认命名为
表名_id_seq):
SELECT pg_get_serial_sequence('your_app_yourmodel', 'id');
- 重置序列起始值为最大ID+1:
ALTER SEQUENCE your_app_yourmodel_id_seq RESTART WITH (SELECT MAX(id) + 1 FROM your_app_yourmodel);
MySQL/MariaDB
- 查询目标表的最大主键ID:
SELECT MAX(id) FROM your_app_yourmodel;
- 修改表的自增起始值(将
101替换为查询到的最大ID+1):
ALTER TABLE your_app_yourmodel AUTO_INCREMENT = 101;
SQLite
SQLite通过sqlite_sequence表管理自增计数器,操作步骤如下:
- 查询目标表的计数器记录:
SELECT * FROM sqlite_sequence WHERE name='your_app_yourmodel';
- 更新计数器值(将
101替换为查询到的最大ID+1):
UPDATE sqlite_sequence SET seq=101 WHERE name='your_app_yourmodel';
- 如果表不在
sqlite_sequence中,直接插入记录:
INSERT INTO sqlite_sequence (name, seq) VALUES ('your_app_yourmodel', 101);
验证操作
执行完数据库命令后,可通过Django shell测试:
python manage.py shell
在shell中创建对象并检查ID:
from your_app.models import YourModel new_obj = YourModel.objects.create(字段名=值) print(new_obj.id) # 输出应为迁移数据的最大ID+1
内容的提问来源于stack exchange,提问作者نور محمد
相关产品推荐
相关产品推荐

