如何判断sqlite列是否为AUTOINCREMENT?

时间:2014-01-07 18:38:31

标签: sql sqlite

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

我试过

PRAGMA table_info('table name') ;

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

2 个答案:

答案 0 :(得分:7)

使用

查询
PRAGMA TABLE_INFO(yourtable);

您可以获取主键列名称。

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

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

解读:

  • 如果计数结果为非零,则该表具有自动增量主键列。

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

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

答案 1 :(得分:1)

原谅我,因为我犯了罪:

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
  2. 内的列定义中显示sqlite_master标记
  3. 该列的类型为integer(当前SQLite需要)
  4. 由于正则表达式不可用,因此该查询使用递归方法匹配所有列。请原谅我。

    当然......

    您也可以在某个客户端处理sqlite_master.sql内容,例如:一个Java程序,使用简单的正则表达式,如果这对你来说更容易。