簡體   English   中英

如何防止自動增量跳過mysql數據庫中的id號?

[英]how to prevent auto increment from skipping id numbers in a mysql database?

好的,我們假設我有一個包含兩列的mysql數據庫表,一個用於id,另一個用於密碼。 如果我有三行數據並且id值從1到3並且我刪除第3行然后創建另一行數據,我將在新創建的行上看到id = 4而不是id = 3。 我知道這與自動增量值有關,但我想知道我是否可以在php文件中添加一些代碼,這些代碼將自動重置所有id號,這樣你就可以從id = 1開始,然后轉到最后一個id號。刪除一行后的增量為1?

我的目標是創建一個表單,用戶輸入密碼,系統將密碼與數據庫中的密碼值匹配。 如果匹配,將刪除具有匹配密碼的行,並且將重新排序id號列,以便不跳過id號。

更新:我正在通過將1到4的隨機數設置為變量來制作旋轉橫幅廣告系統,以便php文件將使用隨機數變量從id = 1到id = 4檢索隨機廣告。 如果隨機數恰好為3且id = 3不存在,則橫幅廣告行中將存在間隙。 如果有辦法解決這種情況下的巨大差距,請告訴我。 提前致謝

只需執行以下SQL查詢:

ALTER TABLE `tbl_name` AUTO_INCREMENT = 1;

......但這聽起來像是一個糟糕的主意,所以不要這樣做。 為什么主鍵的價值如此重要? 唯一性更為重要,重置它會破壞它。

你只能使用

ALTER TABLE 'tbl' AUTO_INCREMENT=#

重置為高於最高值的數字。 如果您有1,2,3,並且刪除2,則不能使用它來填充2.如果刪除3,則可以使用它來重復使用3(假設您沒有更高的值)。 這是你能做的最好的事情。

ALTER TABLE 'table' AUTO_INCREMENT = 1;

但是,運行此代碼並不是最好的主意。 如果您依賴列沒有間隙,那么您的應用程序有問題。 你想算一下用戶數嗎? 如果是這樣使用COUNT(id)? 你在試圖處理其他桌子嗎? 如果是這樣,請使用外鍵。

如果你已經死定了這個錯誤的方法,你可以嘗試尋找最低的免費號碼,並自己做增量。 但請記住,競爭條件涉及到。

另外,請記住,如果更改數據庫中的實際數字,則需要在其他表和代碼中更改對它的所有引用。

你可以這樣做:

  1. 想要插入時創建一個提供下一個可用id的機制(例如,涉及在某處讀取和遞增整數列的事務 - 特別注意事務隔離級別!)
  2. 使用UPDATE遞減所有id大於你剛刪除的id(再次,使用事務 - 不要忘記外鍵必須是ON UPDATE CASCADE!)

但它引出了一個問題: 你為什么要這樣? 是值得的麻煩嗎?

幾乎可以肯定,如果沒有這樣的巫術,你可以實現你的目標。

更新(發表評論):

要選擇隨機數行,您可以在MySQL中進行

SELECT id FROM banners ORDER BY RAND() LIMIT 5

選擇5個隨機的,保證現有的橫幅ID。

需要注意的是:有很多人認為ORDER BY RAND()是一個糟糕的表現。 然而,恕我直言,將每個案件都放在同一個籃子里是不對的。 如果表中的行數是可管理的(我認為任何低於10K的行數都不是那么多)那么ORDER BY RAND()提供了一個非常好的和簡單的解決方案。 此外, 文檔本身也提出了這種方法:

但是,您可以按隨機順序檢索行,如下所示:

mysql> SELECT * FROM tbl_name ORDER BY RAND();

ORDER BY RAND()結合LIMIT對於從一組行中選擇隨機樣本非常有用:

mysql> SELECT * FROM table1,table2 WHERE a = b AND c ORDER BY RAND()LIMIT 1000;

RAND()並不是一個完美的隨機發生器。 這是一種快速生成按需隨機數的方法,可以在同一MySQL版本的平台之間移植。

那么,您實際上只需指定您希望記錄作為插入語句的一部分的ID號,例如:

INSERT INTO person VALUES(1,'John','Smith','jsmith@devnull.fake','+19995559999');

如果沒有主鍵沖突(數據庫中沒有id = 1的記錄),那么MySQL將很樂意執行它。

ALTER TABLE 'tbl' AUTO_INCREMENT=# thing也有效,這意味着您不必跟蹤計數器。

但是,當您考慮這個問題時,您可能想要閱讀有關自然和代理鍵的一些討論。 讓你的身份#特別重要的想法有點不尋常,可能是設計困難的標志。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM