我正在使用SQLAlchemy(目前正在测试SQLite,但也需要它在其他地方工作)我遇到了主键ID被重用的问题。
例如,如果我有一些来自1-6的ID的内容,然后删除ID为4的内容,我仍然希望添加的下一个内容的ID为7而不是4(因为它当前发生)。 会话重置后可以重用ID(或不重要,无论哪种方式都无关紧要)。
我猜这取决于您使用的数据库类型(以及它的自动增量策略/实现),但我需要一种方法让它至少在SQLite,mySQL和PostgreSQL中工作(其他人不是不重要,但他们也不会受伤)。
任何帮助或指向正确的方向都将不胜感激!
答案 0 :(得分:3)
这是一个特定于RDBMS的功能,而不是SQLAlchemy需要关注的功能。
通常数据库将使用单调递增的ID(新值高于先前的值,通常为+1,但步长更大)。
这里唯一真正的例外是SQLite;它会为您提供最高的当前使用的值加一。这意味着如果从表中删除MAX(id)
,则该ID可能会重新用于将来的行插入。请参阅SQLite autoincrement documentation。请注意,您在帖子中声称的行为实际上并未发生;选择MAX(rowid) + 1
,或改为使用SELECT seq + 1 FROM sqlite_sequence WHERE name=<tablename>;
。
您可以通过为表格设置sqlite_autoincrement=True
来切换到正确的自动增量(永远不会重复使用值)。请参阅specific dialect documentation。
如果您计划使用Oracle作为后端,还需要explicitly add a Sequence()
到需要自动增量的列。