我有一個帶有AUTO_INCREMENT主鍵的表。如果表格中的最後一行被刪除,則下一行插入的行將採用相同的ID。停止MySQL重用AUTO_INCREMENT ID
有沒有辦法使MySQL的行爲像T-SQL一樣,而不是重用ID?然後,如果刪除的行被錯誤地從數據庫的外部引用,則不會返回任何行,從而突出顯示該錯誤。
我有一個帶有AUTO_INCREMENT主鍵的表。如果表格中的最後一行被刪除,則下一行插入的行將採用相同的ID。停止MySQL重用AUTO_INCREMENT ID
有沒有辦法使MySQL的行爲像T-SQL一樣,而不是重用ID?然後,如果刪除的行被錯誤地從數據庫的外部引用,則不會返回任何行,從而突出顯示該錯誤。
其他在這種情況下,你可能不應該在公開訪問的地方使用AUTO_INCREMENT索引。
要麼從其他數據派生關鍵字段,要麼使用不同的機制來創建您的ID。我之前使用過的一種方式是,雖然您需要了解(可能會造成嚴重)的性能影響,但它是一個「關鍵」表,用於跟蹤上次使用的密鑰並將其增加。
這樣,您可以使用任何類型的鍵,即使是非數字鍵,然後使用您自己的算法增加它們。
我用6個字符的字母數字鍵,在過去:
CREATE TABLE `TableKeys` (
`table_name` VARCHAR(8) NOT NULL,
`last_key` VARCHAR(6) NOT NULL,
PRIMARY KEY (`table_name`)
);
SELECT * FROM `TableKeys`;
table_name | last_key
-----------+---------
users | U00003A2
articles | A000166D
products | P000009G
這不是我們的MySQL數據庫的工作方式,當一條記錄被刪除時,下一個插入的是下一個數字,而不是被刪除的數字。
我認爲當你重新啓動數據庫將其重置。 – 2010-09-15 14:20:47
InnoDB在重新啓動數據庫時重置。當InnoDB啓動時,它會找到最高的增量,然後從那裏開始。 MyISAM緩存增量ID,所以這不會發生。 – 2010-09-15 16:21:49
在我使用的MySQL(5.7.x)中,一旦最高密鑰的記錄被刪除,下一個新記錄>立即<重新使用該密鑰值。不需要重啓數據庫。 – Riva 2016-08-06 18:56:09
據我所知,沒有辦法做到這一點。您可以考慮通過添加已刪除的標誌來解決此問題,然後設置已刪除的標誌而不是刪除該行。
「正確」的答案是,一旦刪除了一行,就不應該引用它。您可以添加外鍵以確保該數據庫不會允許刪除在數據庫中其他位置引用的行。
對不起,我只是重讀你的問題,並且看到你並不擔心引用已刪除行的其他數據庫元素,而是被引用爲「數據庫外部」。這將表明可能是某個用戶書籤鏈接,其中包含該網址中的ID,然後當他們重複使用該書籤而不是獲得任何結果時,它們會得到錯誤的結果。在這種情況下,我想說刪除標誌可能是最好的方法,並且在訪問數據時更改表示邏輯以顯示適當的「已刪除」用戶消息。 – 2010-09-15 14:24:17
刪除標誌的問題在於,您必須記住在訪問數據的每個查詢中(並且在我的情況下有很多查詢)將它用作約束條件,然後考慮任何索引影響 – Paul 2010-09-15 20:45:01
MySQL手冊says:
在這種情況下(當AUTO_INCREMENT列是多列索引的一部分),如果刪除與任何組的最大AUTO_INCREMENT值的行AUTO_INCREMENT值重複使用。 即使對於其中AUTO_INCREMENT值通常不被重用的MyISAM表,也會發生這種情況。
似乎有這種可能一個行爲引擎,比MyISAM數據
在其他所有方面, AUTO_INCREMENT很好地服務於我的目的,並且保持插入查詢的簡單性。我想我會使用「ALTER TABLE x AUTO_INCREMENT = y」構造來強制刪除標識轉發。 – Paul 2010-09-15 21:00:37