2015-12-14 64 views
1

目前的表结构是这样的:如何减少SQL数据库中的自动增量数?

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

该表存储中的所有用户选项,id是自动-inc

的问题是:

1)是否有必要保持每个表的ID?看起来常见的做法是保持每个表的系统生成的ID

2)每当用户更新他们的perference时,我将清除他的所有相关记录并插入更新一个,auto-inc编号将变得非常大后来。我怎样才能防止呢?

感谢您的帮助。

+0

?你有MySQL和SQL Server标记。 – sstan

+0

对不起,是mysql – user3538235

+0

经常性的'int'可以容纳'2^32'或'4294967296' - 这会有相当长的一段时间,直到你超过它。如果你担心你会超过42亿的数字,你可以很容易地使用'bigint',它等于'18446744073709551615' - 足够的数字。 –

回答

1

您可以定期重置自动递增计数器回1,以保证ID不会成为过的记录频繁的删除的过程中任意大(和稀疏)。

在MySQL:

ALTER TABLE table_name AUTO_INCREMENT = 1 

在SQL Server:

DBCC CHECKIDENT (table_name, RESEED, 0) 

这些命令将自动递增计数器复位为1,或者最接近于1,如果该值1已被另一条记录使用。

+0

或者是必需的ID?如果重置id将重叠 – user3538235

+1

Danger Will Robinson:确保您在任何包含引用您正在重置的主键的外键的表上正确设置级联属性。 – nicomp

0

你做不是需要有一个AUTO_INCREMENTPRIMARY 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您正在使用哪个数据库