pj2*_*452 22 django primary-key models instances
我一直在研究我的Django Web应用程序的离线版本,并经常删除某个ModelX的模型实例.
我是从管理页面完成此操作并且没有遇到任何问题.该模型只有两个字段:名称和顺序,与其他模型没有其他关系.
新实例被赋予下一个可用的pk,当我删除所有实例时,添加一个新实例会产生pk = 1,这是我所期望的.
将代码在线移动到我的实际数据库我注意到情况并非如此.我需要更改模型实例,所以我删除了它们,但令我惊讶的是,主键不断增加而不重置为1.
使用我检查过的Django API进入数据库并且旧实例已经消失,但是即使添加新实例也会产生一个主键,它可以在最后一个被删除的实例停止的地方找到,而不是1.
想知道是否有人知道这里可能存在什么问题.
knb*_*nbk 22
我不会称之为问题.这是许多数据库系统的默认行为.基本上,表的自动递增计数器是持久的,删除条目不会影响计数器.主键的实际值不影响性能或任何东西,它只具有美学价值(如果你达到20亿的限制,你很可能会担心其他问题).
如果您确实要重置计数器,可以删除并重新创建表:
python manage.py sqlclear <app_name> > python manage.py dbshell
Run Code Online (Sandbox Code Playgroud)
或者,如果您需要保留应用程序中其他表的数据,您可以手动重置计数器:
python manage.py dbshell
mysql> ALTER TABLE <table_name> AUTO_INCREMENT = 1;
Run Code Online (Sandbox Code Playgroud)
您在离线和在线应用程序中看到不同行为的最可能原因是,自动增量值仅存储在内存中,而不是存储在磁盘上.它是重新计算MAX(<column>) + 1每个数据库服务器重新启动的时间.如果表为空,则在重新启动时将完全重置.这可能经常用于您的离线环境,并且对于您的在线环境几乎为零.
Dan*_*man 19
正如其他人所说,这完全是数据库的责任.
但你应该意识到这是理想的行为.ID唯一标识数据库中的实体.因此,它应该只引用一行.如果随后删除了该行,则没有理由要求新行重新使用该ID:如果您这样做,则会在现在已删除的实体之间创建一个混淆,该实体曾经拥有该ID,并且新创建的一个重用它.这样做是没有意义的,你不应该这样做.
您实际上是从数据库中删除了它们还是使用 Django 删除了它们?Django 不会AUTO_INCREMENT仅仅通过从中删除行来改变你的表,所以如果你想重置你的主键,你可能必须进入你的数据库并且:
ALTER TABLE <my-table> AUTO_INCREMENT = 1;
Run Code Online (Sandbox Code Playgroud)
(这假设您使用的是 MySQL 或类似版本)。
| 归档时间: |
|
| 查看次数: |
18948 次 |
| 最近记录: |