用自动增量主键约束替换sqlite.net“bigint”和整数

时间:2014-06-07 08:11:10

标签: sqlite xamarin auto-increment portable-class-library sqlite.net

我们正在为我们的移动项目使用sqlite - 但是当我们尝试使用我们的长id变量作为主键自动增量时 - 代码给出错误“Autoincrement is only allowed in integer primary key”。当我在网上查看这个错误时,我发现bigint类型不允许在sqlite中自动增量。

有趣的是bigint也是由整数实现的 - sqlite没有bigint类型 - 它只是使用整数的大小来决定它是否是biginthttp://www.sqlite.org/datatype3.html

要解决这个问题 - 我用“bigint”和“integer”替换了创建表的开源代码,并编写了一些测试代码以验证它是否在常规边界之外工作整数(添加一个id大于整数范围的项目,并连续添加10个对象)。

它似乎现在正在运作 - 但我想知道它是否会导致其他一些问题。我们正在将移动应用程序ID同步到我们的数据库ID,因此我们肯定会有比正常整数范围更大的ID。

此解决方案是否是有效的解决方案?这会引起什么样的麻烦?

1 个答案:

答案 0 :(得分:2)

来自Datatypes In SQLite Version

  

如果声明的类型包含字符串" INT"然后分配 INTEGER affinity

但是,意味着具有INTEGER亲和力的列适合自动递增任务!特殊情况在ROWIDs and the INTEGER PRIMARY KEY中明确提出:

  

.. 如果声明的类型名称完全" INTEGER"。其他整数类型名称,则PRIMARY KEY列仅变为整数主键" INT"或" BIGINT"或者" SHORT INTEGER"或者" UNSIGNED INTEGER"导致主键列表现为具有整数关联和唯一索引的普通表列,而不是rowid的别名。

SQLite中 INTEGER值的最大大小为8个字节(64位,带符号的两个补码),因此可以干净地映射到.NET中的long值(或Java的);如果列被声明为" INTEGER",它必须是自动增量列,或者" BIGINT",这并不重要。 (实际类型为per value, not per column;但是,自动增量/ ROWID值都是整数。)

此外,SQLite自动拥有"记录/行标识符",即使没有明确创建这样的列 - 这是" ROWID"列,可以ROWID_ROWID_OID访问,除非有阴影。如果这是一个合适的选项,请参见SQLite Autoincrement,因为它会更改算法并删除一些单调增加的保证:

  

这些是某些应用程序中的重要属性。但是,如果您的应用程序不需要这些属性,您应该保持默认行为,因为使用AUTOINCREMENT需要额外的工作..