我维护了一个带有自增主键ID的表。当我删除一条记录并重新添加一条时,新的记录不会采用先前记录的ID,而是再次递增一个。这种情况正常吗?是否建议不要更改这种行为?我只是感觉这会创建一个不可扩展的系统,因为最终可能会用尽索引。
我维护了一个带有自增主键ID的表。当我删除一条记录并重新添加一条时,新的记录不会采用先前记录的ID,而是再次递增一个。这种情况正常吗?是否建议不要更改这种行为?我只是感觉这会创建一个不可扩展的系统,因为最终可能会用尽索引。
这是有意而为之的设计,数百万个数据库都有像这样的整数主键。
如果您删除了90%的插入数据,则在插入了4亿行后将用尽密钥1)
如果发生这种情况,您可以执行一项操作
ALTER TABLE `test`.`table1` MODIFY COLUMN `item_id` BIGINT UNSIGNED NOT NULL
, ROW_FORMAT = DYNAMIC;
其中列item_id
将是您的主键。
之后,您将永远不必担心密钥空间耗尽。
不要试图使用bigint作为主键!
如果您知道您的大表将具有大于整数上限的行数,则可以将其设置为bigint,但您应该仅对确实需要的表格执行此操作。特别是在InnoDB表上。
不要使用GUID,它只是浪费了很多空间,99.99%的时间没有任何理由使所有东西都变慢。
1) 使用无符号整数作为主键。
用户niceguy07上传了一张他的小猫咪的图片,这张图片被保存为000012334.jpg。这是因为你使用主键作为文件名,而不是将不可信的用户数据放入其中(这是个好主意)。
niceguy07向他的约会对象发送了一个带有“?picture_id=12334”参数的链接。
niceguy07删除了他的小猫咪图片,然后用户fatperv08上传了一张只穿着蝙蝠侠面具的自拍照。
由于你们的数据库重复使用主键值,所以不幸的是,现在带有“?picture_id=12334”参数的链接指向了一张裸体的肥胖变态穿着蝙蝠侠面具的图片。
重复使用已删除记录的主键值是非常糟糕的做法。事实上,如果主键泄露到数据库之外并在以下情况下被使用:
那么这实际上是一个错误(bug)。鉴于在实际应用中经常需要完成以上所有操作,不重用主键id是个好主意...
没问题。根据您期望的记录数,您可能希望确保它是 bigint
类型,但在大多数情况下 int
应该足够了。
这是正常的。不用担心ID是连续的。
这取决于您计划拥有的记录数量以及它们被删除和添加的频率,但如果这将成为一个问题,请使用bigint
主键。
还有其他选项,例如使用GUID,如果您真的担心用完行数,但我从未遇到过实际需要bigint
的情况,我只是偶尔在易失性表上使用它们以确保安全。
在dykstrad的精彩评论中补充一点
比如说,如果主键指向价格销售点,以一罐健怡可乐为例。懒散的数据管理会直接删除旧的价格并插入新的价格。而良好的数据管理应该更新该商品的信息,在保留关键字和引用关系的前提下,因为它仍然是同一个商品/唯一的关系。