【问题标题】:How to reduce the auto increment number in SQL database?如何减少 SQL 数据库中的自增数?
【发布时间】:2015-12-15 05:17:15
【问题描述】:

目前表结构是这样的:

user_preference
---------------
id
user_id
pref_id

此表存储所有用户选项,id为auto -inc

问题是:

1) 是否有必要为每个表保留一个 ID?为每个表保留一个系统生成的 id 似乎是一种常见的做法

2) 每当用户更新他们的偏好时,我会为他清除所有相关记录并插入更新的记录,以后自动增加数会变得很大。我怎样才能防止这种情况发生?

感谢您的帮助。

【问题讨论】:

  • 您使用的是哪个数据库?您同时标记了 MySQL 和 SQL Server。
  • 常规的int 可以容纳2^324294967296 - 要超过这个值还需要一段时间。如果你担心你会超过 42 亿个数字,你可以很容易地使用 bigint 等于 18446744073709551615 - 足够的数字。

标签: mysql database database-design


【解决方案1】:

您可以定期将自动递增计数器重置为 1,以确保 id 在频繁删除记录的过程中不会变得任意大(和稀疏)。

在 MySQL 中:

ALTER TABLE table_name AUTO_INCREMENT = 1

在 SQL Server 中:

DBCC CHECKIDENT (table_name, RESEED, 0)

这些命令中的每一个都会将自动递增计数器重置为 1,如果 1 已被另一条记录使用,则重置为最接近 1 的值。

【讨论】:

  • 或者id是必要的吗?如果重置,id 将重叠
  • 危险 Will Robinson:确保在包含引用您正在重置的主键的外键的任何表上正确设置了级联属性。
【解决方案2】:

您确实需要为每张桌子有一个AUTO_INCREMENT PRIMARY KEY。有时,有一个“自然”键非常适合 PK。

不要操纵AUTO_INCREMENT 值。不要依赖唯一性以外的任何属性。

您的user_preference 表闻起来像多对多映射?如果是这样,这是最佳选择:

CREATE TABLE user_preference (
    user_id ...,
    pref_id ...,
    PRIMARY KEY(user_id, pref_id),
    INDEX      (pref_id, user_id)
) ENGINE=InnoDB;

有关“为什么”的讨论,请参阅http://mysql.rjweb.org/doc.php/index_cookbook_mysql#many_to_many_mapping_table

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-31
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-30
    • 2016-11-11
    • 2021-12-31
    • 2013-11-28
    相关资源
    最近更新 更多