2009-03-04 54 views
2

當然,如果我放了足夠的行,最終會有重複。但讓我們假設我選擇了一個足夠大的ID字段。即使行被刪除,mysql中的id是否保證不被重複?

我想知道我是否可以假設id隨着時間的推移唯一標識了該行。如果客戶端向我發送了一個id,我希望能夠確定它引用的是哪一行,或者該行是否被刪除(或者它是否是僞造的id,但在這種情況下,我不會在意錯誤地告訴該行是刪除)。

請同時參閱以下內容:如果我重新啓動數據庫,或者備份和恢復 - 這將是繼續創建一個ID在何處離開 - 或者可能會決定

回答

4

如果以「在孔中填入」你有一個「int not null自動遞增主鍵」,你永遠不會重置,那麼是的ID將不會被重用。

然而,這引發了一個有趣的問題 - 如果你碰巧重用舊的ID(即使它不會默認在MySQL中發生,但人爲因素總是計數)?

如果您的數據庫已正確規範化,則級聯受到限制,您的應用程序應該能夠處理ID的重用。

編輯(因爲你編輯你的帖子,我會充實我的答案),關於這句話:「如果客戶端發送我一個ID我希望能夠確定它是指哪一行,或者該行被刪除「。如果它沒有被刪除(這對於能夠從數據庫中提取信息至關重要),可以確定ID屬於哪一行。

然而如果ID是指該行被刪除,那麼它的可能確定它屬於哪一行來......因爲它不存在。如果你需要這個,我會建議你實施某種類型的審計功能,最好是triggers

+0

什麼時候重置?這是我用命令做的事情,還是可以作爲某種事物的副作用發生? – flybywire 2009-03-04 08:10:12

2

當前的自動增量值通過備份/恢復的附加屬性保留在表中。你可以看到它在剛剛發動機之後轉儲=:

mysql> create table foo (bar int(11) primary key auto_increment); 
Query OK, 0 rows affected (0.06 sec) 

mysql> insert into foo() values(),(),(),(); 
Query OK, 4 rows affected (0.00 sec) 
Records: 4 Duplicates: 0 Warnings: 0 

mysql> show create table foo \G 
*************************** 1. row *************************** 
     Table: foo 
Create Table: CREATE TABLE `foo` (
    `bar` int(11) NOT NULL auto_increment, 
    PRIMARY KEY (`bar`) 
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 
1 row in set (0.00 sec) 

則可以使用「ALTER TABLE表名AUTO_INCREMENT =」重置,但在我看來像 屬性值將被忽略,如果它不是比插入時的最大現有ID多。

0

還注意到,所描述的不重複使用先前使用的ID的行爲對於MyISAM引擎是有效的,但實際上並不適用於所有可用的引擎。