如果一个表是自动增量的,你怎么能从一个 sqlite 表的元数据中得到?

Posted

技术标签:

【中文标题】如果一个表是自动增量的,你怎么能从一个 sqlite 表的元数据中得到?【英文标题】:How could you get if a table is autoincrement or not from the metadata of an sqlite table? 【发布时间】:2013-09-12 17:10:12 【问题描述】:

如果您在任何 sqlite 数据库中有多个表,如何获取它们是否具有自动递增主键的信息?

例如,我已经知道您可以通过简单地查询以下内容来获取有关表列的一些信息:pragma table_info(tablename_in_here)

动态获取自增列比在源代码中使用布尔值设置每个对应模型要好得多。

编辑: 让我以这张表为例:

CREATE TABLE "test" (
"id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
"name" TEXT NOT NULL
)

这是执行pragma table_info("test")后的结果表

cid | name | type    | notnull | dflt_value | pk
  0 |   id | INTEGER |       1 |       null |  1
  1 | name |    TEXT |       1 |       null |  0

如您所见,id 列是否为自动增量没有任何信息

编辑2: 我正在寻找一个通过语句直接涉及 sqlite 的解决方案。 可以使用终端中的sqlite3 命令以某种方式从内部解析所需信息的特殊情况是可接受的。它们在不允许您以编程方式在终端中执行命令的情况下不起作用。就像在 android 应用中一样。

【问题讨论】:

自动增量究竟是什么意思? rowid 还是真的 AUTOINCREMENT - sqlite.org/autoinc.html? @CL。 answer 已找到 rowid 列的别名。 【参考方案1】:

将主键 must be declared 自动递增为 INTEGER PRIMARY KEY 或其他等效项,因此您可以使用 table_info 日期来检测它们。

如果在PRAGMA table_info 输出中,列是INTEGER PRIMARY KEY 列,

typeintegerINTEGER 或任何其他不区分大小写的变体;和 pk 已设置;和 没有为任何其他列设置pk

要检查列定义是否包含AUTOINCREMENT 关键字,您必须直接查看sqlite_master 表; SQLite 没有其他机制可以访问此信息。 如果此查询返回一条记录,则您在表定义中的某处有 AUTOINCREMENT 关键字(如果注释掉该词,可能会返回错误结果):

SELECT 1
FROM sqlite_master
WHERE type = 'table'
  AND name = 'tablename_in_here'
  AND sql LIKE '%AUTOINCREMENT%'

【讨论】:

我认为应该说一下可选的 AUTOINCREMENT 键所暗示的独特行为 - sqlite.org/autoinc.html。 @AlixAxel 我不明白。你说的应该说什么是什么意思? @GeorgePligor:(移动)您的表定义有一个自动增量关键字,但是提供的定义 CL 对 rowids 是正确的,但对于真正的自动增量列不一定正确。一个意味着一个额外的表,另一个没有 阅读我分享的链接了解更多详情。 @GeorgePligor PRAGMA table_info 语句可以像任何其他 SQL 语句一样执行,并像 SELECT 语句一样返回一个表。【参考方案2】:

您可以解析.schema 的输出。这将为您提供用于创建表的 sql 命令。如果声明了自动增量,您将在输出中看到它。这样做的好处是它也会列出所有表格。

【讨论】:

我试过你的建议,只能通过命令行中的 sqlite 工作。我没有这样的访问权限,也无法以编程方式执行终端命令来获得结果。事实上,我希望在 Android 中使用它,我所能做的就是有效的 sql 语句。我试过了,.schema 将异常作为无效的 sqlite 语句抛出。

以上是关于如果一个表是自动增量的,你怎么能从一个 sqlite 表的元数据中得到?的主要内容,如果未能解决你的问题,请参考以下文章

禁用/删除雪花中的自动增量属性

基于python的scrapy爬虫,关于增量爬取是怎么处理的

Oracle中如何将自动增量添加到现有表中

1298. 你能从盒子里获得的最大糖果数

计算中常说的元表是啥?

getHibernateTemplate.save() - 如何获取受影响的行/新的自动增量