用整数替换 sqlite.net “bigint” 以实现自动增量主键约束
Posted
技术标签:
【中文标题】用整数替换 sqlite.net “bigint” 以实现自动增量主键约束【英文标题】:Replacing sqlite.net "bigint" with integer for autoincrement primary key constraint 【发布时间】:2014-07-28 12:19:44 【问题描述】:我们将 sqlite 用于我们的移动项目 - 但是当我们尝试使用我们的长 id 变量作为主键自动增量时 - 代码给出错误“Autoincrement is only allowed in integer primary key
”。当我在网上查看这个错误时,我发现bigint
类型不允许sqlite中的自动增量。
有趣的是bigint
也是由整数实现的——sqlite 没有bigint
类型——它只是使用整数的大小来决定它是否是bigint
。
http://www.sqlite.org/datatype3.html
为了解决这个问题 - 我用“bigint
”替换了创建表的开源代码,并用“integer
”替换了它,并编写了一些测试代码来验证它是否可以在常规整数的边界之外工作(添加了一个id 大于整数范围的 item 并连续添加了 10 个对象)。
它现在似乎正在运行 - 但我想知道它是否会导致其他一些问题。我们正在将移动应用程序 ID 同步到我们的数据库 ID,因此我们肯定会有大于正常整数范围的 ID。
这个解决方案是一个有效的解决方案吗?这会造成什么样的麻烦?
【问题讨论】:
【参考方案1】:来自Datatypes In SQLite Version:
如果声明的类型包含字符串“INT”,则为其分配 INTEGER 亲和性。
但是,这不是意味着具有 INTEGER 亲和性的列适用于自动增量任务!特殊情况在ROWIDs and the INTEGER PRIMARY KEY中明确列出:
.. 如果声明的类型名称完全为“INTEGER”,则 PRIMARY KEY 列仅成为整数主键。其他整数类型名称,如“INT”或“ BIGINT" 或 "SHORT INTEGER" 或 "UNSIGNED INTEGER" 导致主键列表现为具有整数亲和性和唯一索引的普通表列,而不是 rowid 的别名。
SQLite 中 INTEGER 值 的最大大小为 8 字节(64 位,带符号的二进制补码),因此可以清晰地映射到 .NET(或 Java)中的 long
值;该列是否被声明为“INTEGER”并不重要,它必须用于自动增量列,或者使用“BIGINT”。 (实际类型是per value, not per column;但是,自动增量/ROWID 值都将是整数。)
此外,SQLite 自动具有“记录/行标识符”,即使没有显式创建这样的列 - 这是“ROWID”列,可以以ROWID
、_ROWID_
或OID
访问,除非有阴影.如果这是一个合适的选项,请参阅SQLite Autoincrement,因为它会更改算法并删除一些单调递增的保证:
这些是某些应用程序中的重要属性。但是,如果您的应用程序不需要这些属性,您可能应该保持默认行为,因为使用 AUTOINCREMENT 需要额外的工作。
【讨论】:
我明白你的意思——但我要问的是,使用 sqlite.net 对整数 sqlite 列使用长变量是否有任何缺点 @user3141326 我已经通过答案扩展了。在任何情况下,将 SQLite 中的整数字段(包括自增列)映射到 64 位有符号整数(即 long,System.Int64)是没有问题的。以上是关于用整数替换 sqlite.net “bigint” 以实现自动增量主键约束的主要内容,如果未能解决你的问题,请参考以下文章
Informix 中 MySQL 的 BIGINT 的替换数据类型是啥?