2012-09-18 64 views
0

我有一個PHP頁面,它與這個小型的MySQL數據庫表以一個簡單的結構進行交互。 ID,Name,Address是該領域。主鍵是ID重新排列主鍵

+------+------------+-------------+ 
| ID | Name  | Country | 
|______|____________|_____________| 
| E001 | Stephen | America | 
| E002 | John  | Britain | 
| E003 | Kate  | Canada | 
| E004 | Carlos | Spain  | 
| E005 | James  | Australia | 
|______|____________|_____________| 

如果我刪除的記錄在E003,它看起來像這樣。

+------+------------+-------------+ 
| ID | Name  | Country | 
|______|____________|_____________| 
| E001 | Stephen | America | 
| E002 | John  | Britain | 
| E004 | Carlos | Spain  | 
| E005 | James  | Australia | 
|______|____________|_____________| 

的間隙出現E004 E002和之間

有沒有辦法以填寫那個差距?像這樣

+------+------------+-------------+ 
| ID | Name  | Country | 
|______|____________|_____________| 
| E001 | Stephen | America | 
| E002 | John  | Britain | 
| E003 | Carlos | Spain  | 
| E004 | James  | Australia | 
|______|____________|_____________| 

其中有E004此前戰績,陷入E003的地方。前E005得到號碼E004等等。像記錄退一步

有沒有辦法做到這一點編程?

+1

當您移動/重新編號記錄的唯一ID時,是否不會刪除主鍵的用途? – tradyblix

回答

1

是否有你需要重新編號的原因?關鍵的價值觀並不重要。如果他們這樣做(即,它們用於外部目的),請考慮讓外部鍵爲表中的常規列,並讓主鍵爲自動增量整數字段。即使你這樣做,你仍然可能不應該重新編號鍵。這意味着所有的外部依賴也需要更新。這樣做沒什麼價值。

但是,如果你要...

如果鍵是自動遞增(它應該是),你可以這樣做:

ALTER TABLE MyTable DROP ID; 
ALTER TABLE MyTable ADD COLUMN ID INT NOT NULL PRIMARY KEY AUTO_INCREMENT FIRST; 

如果不是的話,那麼你就可以做幾件事情,但最簡單的可能是使用變量作爲計數器。爲了使這更簡單,請不要使用字符串主鍵,而是使用純數字主鍵。

SET @id = 0; 

UPDATE MyTable 
SET ID = (@id := @id + 1) 
ORDER BY ID; 
+0

其實沒有什麼強烈的原因。我只是不喜歡這個關鍵字段的值。我現在知道了。我沒有想太深。謝謝你的好解釋。 – Isuru

1

在您的數據庫表中ID是主鍵,它是字母數字。

我不這麼認爲這是重新排列表中主鍵的好方法。所有與其他表格的關係都會混亂。

嘗試使用數字主鍵而不是字符串。

如果您使用數字主鍵,則可以通過刪除並使用自動增量重新創建主鍵列來重新排列它們。

0

由於您的ID字段不是integer字段,因此只能使用一個查詢執行此操作,並且您需要對間隔後的所有記錄執行循環並更新ID字段。

但更好的方法可能是改變ID申請類型爲自動遞增無符號整數,然後通過了解過去的ID的差距等於gID之前,你可以做這樣的查詢:

UPDATE table_name SET `ID` = (`ID` - 1) WHERE `ID` > gID; 

然後你只需要更新您的AUTO_INCREMENT值:

ALTER TABLE `table_name` AUTO_INCREMENT = (SELEC `ID` FROM `table_name` ORDER BY `ID` DESC LIMIT 1); 

由於您ID字段中的所有記錄都有共同的字母「E」,有可能擺脫這封信並將字段類型更改爲AUTO INCREMENT UNSIGNED INTEGER