當然,如果我放了足夠的行,最終會有重複。但讓我們假設我選擇了一個足夠大的ID字段。即使行被刪除,mysql中的id是否保證不被重複?
我想知道我是否可以假設id隨着時間的推移唯一標識了該行。如果客戶端向我發送了一個id,我希望能夠確定它引用的是哪一行,或者該行是否被刪除(或者它是否是僞造的id,但在這種情況下,我不會在意錯誤地告訴該行是刪除)。
請同時參閱以下內容:如果我重新啓動數據庫,或者備份和恢復 - 這將是繼續創建一個ID在何處離開 - 或者可能會決定
當然,如果我放了足夠的行,最終會有重複。但讓我們假設我選擇了一個足夠大的ID字段。即使行被刪除,mysql中的id是否保證不被重複?
我想知道我是否可以假設id隨着時間的推移唯一標識了該行。如果客戶端向我發送了一個id,我希望能夠確定它引用的是哪一行,或者該行是否被刪除(或者它是否是僞造的id,但在這種情況下,我不會在意錯誤地告訴該行是刪除)。
請同時參閱以下內容:如果我重新啓動數據庫,或者備份和恢復 - 這將是繼續創建一個ID在何處離開 - 或者可能會決定
如果以「在孔中填入」你有一個「int not null自動遞增主鍵」,你永遠不會重置,那麼是的ID將不會被重用。
然而,這引發了一個有趣的問題 - 如果你碰巧重用舊的ID(即使它不會默認在MySQL中發生,但人爲因素總是計數)?
如果您的數據庫已正確規範化,則級聯和受到限制,您的應用程序應該能夠處理ID的重用。
編輯(因爲你編輯你的帖子,我會充實我的答案),關於這句話:「如果客戶端發送我一個ID我希望能夠確定它是指哪一行,或者該行被刪除「。如果它沒有被刪除(這對於能夠從數據庫中提取信息至關重要),可以確定ID屬於哪一行。
然而如果ID是指該行被刪除,那麼它的不可能確定它屬於哪一行來......因爲它不存在。如果你需要這個,我會建議你實施某種類型的審計功能,最好是triggers。
當前的自動增量值通過備份/恢復的附加屬性保留在表中。你可以看到它在剛剛發動機之後轉儲=:
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多。
還注意到,所描述的不重複使用先前使用的ID的行爲對於MyISAM引擎是有效的,但實際上並不適用於所有可用的引擎。
什麼時候重置?這是我用命令做的事情,還是可以作爲某種事物的副作用發生? – flybywire 2009-03-04 08:10:12