【问题标题】:Is the field CONTACT_ID in the contactcontracts table a AUTO_INCREMENTcontactcontracts 表中的字段 CONTACT_ID 是否为 AUTO_INCREMENT
【发布时间】:2012-12-16 04:41:12
【问题描述】:

我正在为联系人创建一个新数据库,并将 conatctscontract 字段的contact_id 作为主键。我的问题是,如果有人删除联系人中的一行,那么该联系人的 contact_id 是否会被 android 系统重用。如果是这样,那么如何防止在我的应用程序中使用该联系人 ID,或者是否有更好的方法来解决这个问题?

【问题讨论】:

    标签: android


    【解决方案1】:

    我假设您使用 MySQL。数据库系统自动递增contact_id 主键。当该行被删除时,该 id 已经被“使用”并存储在数据库中作为“使用”可以说,即使该行本身已被删除。只要您不重置 auto_increment 起点(语法看起来像这样),它将继续保持这种状态

    ALTER TABLE contact AUTO_INCREMENT = 0;
    

    如果您使用 auto_increment 功能,只要您不重置该表的 auto_increment 设置(据我所知),已删除的 contact_id 将不会被重复使用。它只会从数据库中存储的最高 ID 继续。

    编辑:如果我没记错的话,使用 auto_increment 的列用于存储最新的“auto_incremented”数字的特殊数据库统计表(您不可用,但自动从数据库存储)。使用上面的语法会将 auto_increment 重置回 0 并从那里恢复,填补已删除的空白。

    【讨论】:

    • 所以如果我有contact_id=20,并且我删除了它,那么contact_id 20 将永远不会被再次使用,对吧? (我说的是android中的contactcontracts表)
    • SQLite 使用特殊的 SQLITE_SEQUENCE 表来跟踪表曾经拥有的最大 ROWID。每当创建包含 AUTOINCREMENT 列的普通表时,就会自动创建和初始化 SQLITE_SEQUENCE 表。可以使用普通的 UPDATE、INSERT 和 DELETE 语句修改 SQLITE_SEQUENCE 表的内容。但是对这个表进行修改可能会扰乱 AUTOINCREMENT 密钥生成算法。在进行此类更改之前,请确保您知道自己在做什么。
    • 取自 SQLite 网站。答案是肯定的,除非您从 SQLLITE_SEQUENCE 表中更新它,否则它不能再次使用。这就是为什么他们称其为“自动”增量,这意味着除非您以某种方式更改数据库,否则数据库将自动增量。如果您想更改算法,请查看这篇文章的语法:stackoverflow.com/questions/692856/…
    【解决方案2】:

    如果您指的是内置的contactsprovider 数据库,那么Contacts 表和Data 表的ID 都是AUTOINCREMENT。
    所以我认为id不会被重用。

    您可以查看代码库here

    【讨论】:

    • 是的。感谢那。您是如何找到负责创建联系人数据库的特定文件的?
    • 这是用于在 ContactsProvider 中创建数据库的数据库帮助文件
    猜你喜欢
    • 2011-12-09
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 2014-05-29
    • 2015-08-23
    • 1970-01-01
    相关资源
    最近更新 更多