[英]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.