2012-03-14 20 views
0

删除最后一个模型后,下一个将要创建的模型将被分配已删除的模型pk,这意味着到已删除模型的任何链接都将指向新模型。是PK有效的绝对ID? (Django)

那么我们应该使用PK还是创建一个UUID? 例如用户配置文件,某些高级配置文件在删除时将指向一些全新的配置文件。

  • 这个网站,堆栈溢出采用PK的问题,我不知道是否有什么我写在这里也适用
+0

“删除最后一个模型后,将要创建的下一个模型将被分配删除型号PK”你确定吗?你测试过了吗?如果是这样,你在用什么数据库?至少Postgres不会有这种行为,它会不断增加ID而不管被删除的是什么。我不确定其他DB后端。 – AdamKG 2012-03-14 10:44:33

+0

我测试了几次,本地主机Django sqlite,也许在生产中使用MySql它需要这种行为,我会检查,谢谢。 – 2012-03-14 10:49:10

回答

1

在最简单的意义上说,数据库使用了PK场计数器并在添加新记录时增加它。删除/更新操作不会修改计数器。所以db不可能使用两次相同的值。

编辑:OOPS,这似乎是Sqlite的一个功能。详情请看这里:http://sqlite.org/autoinc.html

引述文档:

如果在刀片没有指定ROWID,或者指定的ROWID具有 NULL值,然后适当的ROWID被自动创建。 通常的算法是给予新创建的行的ROWID为 ,比插入前表中最大的ROWID大一些。

和:

上述将产生,只要你不使用 最大ROWID值,你永远不删除与 在表中的条目 单调递增独特的ROWID正常ROWID选择算法最大的ROWID。

+0

当测试本地使用 - “django.db.backends.sqlite3”作为数据库它的确为使用新车型已删除的PK。在生产中,或者至少在使用MySql时PK按预期递增,并且始终是唯一的 – 2012-03-14 11:06:43

0

可以,事实上,从same link得知你的主键建立AUTOINCREMENT停止这种滋扰。

尝试:

CREATE TABLE "Pity" (
"ID" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL);