刪除最後一個模型後,下一個將要創建的模型將被分配已刪除的模型pk,這意味着到已刪除模型的任何鏈接都將指向新模型。是PK有效的絕對ID? (Django)
那麼我們應該使用PK還是創建一個UUID? 例如用戶配置文件,某些高級配置文件在刪除時將指向一些全新的配置文件。
- 這個網站,堆棧溢出採用PK的問題,我不知道是否有什麼我寫在這裏也適用
刪除最後一個模型後,下一個將要創建的模型將被分配已刪除的模型pk,這意味着到已刪除模型的任何鏈接都將指向新模型。是PK有效的絕對ID? (Django)
那麼我們應該使用PK還是創建一個UUID? 例如用戶配置文件,某些高級配置文件在刪除時將指向一些全新的配置文件。
在最簡單的意義上說,數據庫使用了PK場計數器並在添加新記錄時增加它。刪除/更新操作不會修改計數器。所以db不可能使用兩次相同的值。
編輯:OOPS,這似乎是Sqlite的一個功能。詳情請看這裏:http://sqlite.org/autoinc.html
引述文檔:
如果在刀片沒有指定ROWID,或者指定的ROWID具有 NULL值,然後適當的ROWID被自動創建。 通常的算法是給予新創建的行的ROWID爲 ,比插入前表中最大的ROWID大一些。
和:
上述將產生,只要你不使用 最大ROWID值,你永遠不刪除與 在表中的條目 單調遞增獨特的ROWID正常ROWID選擇算法最大的ROWID。
當測試本地使用 - 「django.db.backends.sqlite3」作爲數據庫它的確爲使用新車型已刪除的PK。在生產中,或者至少在使用MySql時PK按預期遞增,並且始終是唯一的 – 2012-03-14 11:06:43
可以,事實上,從same link得知你的主鍵建立AUTOINCREMENT
停止這種滋擾。
嘗試:
CREATE TABLE "Pity" (
"ID" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL);
「刪除最後一個模型後,將要創建的下一個模型將被分配刪除型號PK」你確定嗎?你測試過了嗎?如果是這樣,你在用什麼數據庫?至少Postgres不會有這種行爲,它會不斷增加ID而不管被刪除的是什麼。我不確定其他DB後端。 – AdamKG 2012-03-14 10:44:33
我測試了幾次,本地主機Django sqlite,也許在生產中使用MySql它需要這種行爲,我會檢查,謝謝。 – 2012-03-14 10:49:10