2015-12-14 62 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您正在使用哪個數據庫