删除的记录没有给我他们的 ID

Posted

技术标签:

【中文标题】删除的记录没有给我他们的 ID【英文标题】:Deleted record are not giving me their ID back 【发布时间】:2021-12-20 10:57:28 【问题描述】:

如果我从表中删除一条记录,然后创建一条新记录,它确实会重用已删除记录中的 ID - 在顺序 ID 中留下空白。有人能帮忙吗? 我相信受影响的代码在这里:

def Delete():
    #open database
    Database()
    if not tree.selection():
        tkMessageBox.showwarning("Warning","Select data to delete")
    else:
        result = tkMessageBox.askquestion('Confirm', 'Are you sure you want to delete this record?',
                                          icon="warning")
        if result == 'yes':
            curItem = tree.focus()
            contents = (tree.item(curItem))
            selecteditem = contents['values']
            tree.delete(curItem)
            cursor=conn.execute("DELETE FROM REGISTRATION WHERE RID = %d" % selecteditem[0])
            conn.commit()
            cursor.close()
            conn.close()

这是我的输出 - 请注意删除记录的顺序间隙:

【问题讨论】:

这是几乎所有数据库引擎中的预期行为,原因有很多(外键完整性超出了我的想象,还有其他原因)。为什么会困扰你? @Marat - 不是真的,但我认为这是异常行为,因为我使用的另一个没有这样做。如果我删除了记录 1,下一条记录输入将进入该插槽。我是初学者,所以将其归结为缺乏经验。 【参考方案1】:

SQLite 定义一个 INTEGER PRIMARY KEY 作为 ROWID 的别名,documents the ROWID selection algorithm 为:

如果插入时没有指定 ROWID,或者指定的 ROWID 的值为 NULL,则自动创建适当的 ROWID。通常的算法是给新创建的行一个比插入前表中最大的 ROWID 大一的 ROWID。如果表最初为空,则使用 1 的 ROWID。

所以,这是意料之中的。除非您删除 ID 最高的行,否则将使用新 ID。

【讨论】:

即使我删除了最后一个条目(最高 ID),它也会在下一个条目时跳过该 ID。但我从文档中看到 AUTOINCREMENT 导致:

以上是关于删除的记录没有给我他们的 ID的主要内容,如果未能解决你的问题,请参考以下文章

mysql从两条完全相同的记录中删除一条记录,没有id

从 Parse 中删除推送通知历史记录条目

SQL Server 表中缺少记录

删除所有违反新唯一约束的记录

使用行 ID 导出唯一行

性能优化——算法优化