2011-06-15 29 views
1

我正在讀取我的數據與整數主鍵或整數的ID。自動增量和減量整數字段在sqlite數據庫中可用?

但刪除任何一行之後...

之後,如果我們把選擇查詢顯示所有。

但它會強制關閉,因爲一個id缺失。

我想這個ID本身可以採取auto increment & decrement

當我刪除一個記錄在最後(ig id = 7)後,我添加一行然後id必須是7不是8.同樣,當我刪除中間行(ig id = 3),那麼所有行通過加入自動指定。

你的想法可以幫助我。

+0

您可以在數據庫中有一個自動增量字段,但是您希望在數據集的末尾刪除記錄的行爲是什麼?並在中間?你想要所有的ID都改變嗎? – Snicolas 2011-06-15 13:58:47

+0

當我刪除一條記錄在結尾(ig id = 7)後,我添加一行然後id必須是7不是8.同樣,當我刪除中間行(ig id = 3),然後所有行自動指定通過加入。 – Siten 2011-06-15 14:02:07

+0

您是否要求自動增加字段填寫從序列中間刪除行所剩的空位?這不是它通常工作的方式。請澄清你的問題;很難理解你想問什麼。 (我的英語不是你的母語。) – 2011-06-15 14:03:20

回答

0

大多數帶有自動遞增列的系統會跟蹤插入的最後一個值(或下一個要插入的值),並且永遠不會重新發出一個數字(給出相同的數字兩次),即使發出的最後一個數字從表中刪除。

從你問的問題來看,SQLite是另一個這樣的系統。

如果系統中的任何併發性,那麼這是有風險的,但對於單用戶,單應用程序 - 在 - 一時間系統,你可能會逃脫:

SELECT MAX(id_column) + 1 FROM YourTable 

到找到下一個可用的值。根據SQLite的行爲方式,你也許可以嵌入在INSERT語句的VALUES列表:

INSERT INTO YourTable(id_column, ...) 
    VALUES((SELECT MAX(id_column) + 1 FROM YourTable), ...); 

這可能無法正常工作;你可能不得不做這兩個操作。請注意,如果有任何併發​​,這兩種語句形式是壞主意TM。主鍵唯一約束通常可以防止災難,但兩個併發語句中的一個失敗,因爲它試圖插入另一個剛剛插入的值 - 所以它必須重試並希望最好。很明顯,手機的併發性不如網絡服務器,所以問題相應不那麼嚴重。不過要小心。

總體而言,儘管如此,最好讓序列中出現空位而不必擔心。通常沒有必要擔心它們。如果你必須擔心差距,不要讓人們擺在首位。或者當您執行刪除操作時,移動現有的行以填充空白處。在添加新行時,這仍然會在最後留下刪除空隙,這就是爲什麼最好克服「它必須是連續的數字序列」心態的原因。自動遞增保證唯一性;它不保證連續性。

+0

@ Jonathan Leffler你的想法是絕對正確的,但是我的問題是如何刪除該行,我如何通過id獲取數據? – Siten 2011-06-17 05:00:18

+0

@Sitanshu:當你知道要獲取的值時,你總是可以通過'id'獲取,但不能保證每個id值都會獲取一行(因爲該值可能已被刪除)。確保表格只包含連續的數字確實非常棘手;這就是爲什麼DBMS不會嘗試去做的原因。如果你做了足夠的工作,並且DBMS支持觸發器等,你可能能夠把事情整理出來,但是所涉及的努力通常太大而不利於實現。那麼,爲什麼你需要完全密集(連續)打包ID值?什麼算法會在刪除後重新分配數字? – 2011-06-17 05:17:25

+0

刪除後的算法尚未編制完成。我認爲從id獲取數據是有風險的。所以我嘗試了不同的解決方案。感謝您的建議。 – Siten 2011-06-17 05:57:21