如何判断sqlite列是否为AUTOINCREMENT?

o8x7eapl  于 2022-11-30  发布在  SQLite
关注(0)|答案(3)|浏览(164)

我使用的是sqlite数据库,我想知道特定列是否为AUTOINCREMENT
我试过了

PRAGMA table_info('table name') ;

但它只提供ID、名称、类型、主键、NOT NULL和默认值

j9per5c4

j9per5c41#

使用查询

PRAGMA TABLE_INFO(yourtable);

可以获取主键列名。
要检查它是否为自动增量列,请检查表是否具有自动增量序列:

SELECT COUNT(*) FROM sqlite_sequence WHERE name='yourtable';

解读:

  • 如果计数结果为非零,则表具有自动增量主键列.
  • 如果计数为零,则表为空且从未包含数据,或者没有自动增量主键列.

虽然SQLite documentation似乎暗示在创建sqlite_sequence表时填充该表,但实际上并非如此,只有在插入数据后计数才可用。

o4hqfura

o4hqfura2#

原谅我,我犯了罪:

WITH RECURSIVE
  a AS (
    SELECT name, lower(replace(replace(sql, char(13), ' '), char(10), ' ')) AS sql
    FROM sqlite_master
    WHERE lower(sql) LIKE '%integer% autoincrement%'
  ),
  b AS (
    SELECT name, trim(substr(sql, instr(sql, '(') + 1)) AS sql
    FROM a
  ),
  c AS (
    SELECT b.name, sql, '' AS col
    FROM b
    UNION ALL
    SELECT 
      c.name, 
      trim(substr(c.sql, ifnull(nullif(instr(c.sql, ','), 0), instr(c.sql, ')')) + 1)) AS sql, 
      trim(substr(c.sql, 1, ifnull(nullif(instr(c.sql, ','), 0), instr(c.sql, ')')) - 1)) AS col
    FROM c JOIN b ON c.name = b.name
    WHERE c.sql != ''
  ),
  d AS (
    SELECT name, substr(col, 1, instr(col, ' ') - 1) AS col
    FROM c
    WHERE col LIKE '%autoincrement%'
  )
SELECT name, col  
FROM d
ORDER BY name, col;

此查询基于两个假设:

  1. autoincrement标志出现在sqlite_master内的列定义中
    1.该列的类型为integer(SQLite当前所需的类型)
    由于正则表达式不能直接使用,所以此查询使用递归方法来匹配所有列。请原谅。
    当然...
    您也可以在某个客户端(例如Java程序)中使用简单的正则表达式简单地处理sqlite_master.sql内容,如果这对您来说更容易的话。
h6my8fg2

h6my8fg23#

有一个线程从山姆和正弦在这个职位See Thread

  • SQLite AUTOINCREMENT只能应用于主键 *

基于此逻辑,您可以使用
SELECT "is-autoincrement" FROM sqlite_master WHERE tbl_name="<your-table-name>" AND sql LIKE "%AUTOINCREMENT%"
正如帖子中提到的。它对我很有效。虽然不确定它的可靠性。

相关问题