簡體   English   中英

自動遞增“id”列的問題

[英]Problem with auto-incremented “id” column

我的db表看起來像這張照片。 http://prntscr.com/22z1n

最近我創建了delete.php頁面。 它工作正常,但當我刪除第21個用戶下一個注冊用戶得到第24個ID而不是21。

是否可以將新注冊的用戶信息放到第一個空行? (在這種情況下排第21行)

在我的注冊表格中,新注冊的用戶可以在注冊后寫下現有用戶的姓名,並與他們成為朋友。 對於這種友誼,我有另一個表關聯新注冊用戶和現有用戶的ID。

為此,我在注冊期間使用mysql_insert_id來獲取新用戶的id。 但是在nex注冊過程中刪除了第21行后,mysql_insert_id給了我21號但是存儲在第24行。 並為新用戶提供關聯表21。 我想解決這個問題

使用自動增量id列時,刪除條目不會減少下一個條目的分配值。 這不是自動增量柱的用途。 數據庫引擎將始終在新插入上增加該數字,並且永遠不會在刪除時減少該數字。

MySQL auto_increment列在內部維護一個數字,並且即使在刪除后也會一直增加它。 如果需要填充空白區域,則必須自己在PHP中處理它,而不是在表定義中使用auto_increment關鍵字。

如果要維護外鍵關系,則回滾以填充空行ID會導致各種困難,並且實際上不建議這樣做。

可以使用SQL語句重置auto_increment ,但不建議這樣做,因為它會導致重復的鍵錯誤。

-- Doing this will cause problems!
ALTER table AUTO_INCREMENT=12345;

編輯要按照注釋中的說明強制執行外鍵關系,您應該添加到表定義中:

FOREIGN KEY (friendid) REFERENCES registration_table (id) ON DELETE SET NULL;

填寫正確的表和列名稱。 現在,當從注冊中刪除用戶時,他們的朋友關聯將被清零。 如果您需要與其他用戶重新關聯,則必須使用PHP進行處理。 mysql_insert_id()不再有用。

如果您需要在刪除后仍然在數據庫中找到編號最高的ID以與朋友關聯,請使用以下內容。

SELECT MAX(id) FROM registration_table;

自動增量是一個序列鍵,它作為表的一部分被跟蹤。 刪除行時不會返回。

很容易,沒有。 您可以做什么(但我不建議這樣做)是使用SQL函數來確定當前未被占用的最小數字。 或者,您可以創建已刪除的ID表,並從中獲取最小的數字。 或者,這是最好的主意,忽略差距,實現數據庫是好的。

您想要做的是通過在表中添加一個名為user_order的額外列來實現。 然后,您可以編寫代碼來管理插入和刪除,以便此列始終是順序的,沒有間隙。

通過這種方式,您可以避免使用auto_increment列時遇到的問題。

重置auto_increment值不是一個好習慣,但如果你真的需要這樣做,那么你可以:

ALTER TABLE mytable AUTO_INCREMENT = 1;

每次刪除后運行此查詢。 Auto_increment值不會設置為1 ,這將自動設置最低可能值。

暫無
暫無

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

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