如何判断sqlite列是否为AUTOINCREMENT?

Abd*_*Gym 6 sql sqlite

我正在使用sqlite数据库,我想知道特定列是否为AUTOINCREMENT

我试过了

PRAGMA table_info('table name') ;
Run Code Online (Sandbox Code Playgroud)

但它只给我ID,NAME,TYPE,PRIMARY KEY,NOT NULL和DEFAULT VALUE

laa*_*lto 7

查询

PRAGMA TABLE_INFO(yourtable);
Run Code Online (Sandbox Code Playgroud)

您可以获取主键列名称.

要检查它是否是自动增量列,请检查该表是否具有自动增量序列:

SELECT COUNT(*) FROM sqlite_sequence WHERE name='yourtable';
Run Code Online (Sandbox Code Playgroud)

解释:

  • 如果计数出现为非零,则表具有自动增量主键列.

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

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

  • 这很方便但你应该知道它不是防弹的.考虑创建表的情况,列是自动增量和主键 - 但表还没有任何记录.在这种情况下,依靠COUNT来确定该列是否是自动增量将导致一个误入歧途...... (4认同)

Luk*_*der 6

原谅我,因为我犯了罪:

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;
Run Code Online (Sandbox Code Playgroud)

此查询基于两个假设:

  1. autoincrement标志存在于您的列定义中sqlite_master
  2. 该列的类型integer(根据 SQLite 当前的要求)

由于正则表达式不是开箱即用的,因此此查询使用递归方法来匹配所有列。请原谅我。

当然...

您还可以sqlite_master.sql使用简单的正则表达式在某些客户端(例如 Java 程序)中简单地处理您的内容,如果这对您来说更容易的话。