【发布时间】:2014-01-25 14:02:07
【问题描述】:
我正在使用一个 sqlite 数据库,我想知道一个特定的列是 AUTOINCREMENT 还是 NOT
我试过了
PRAGMA table_info('table name') ;
但它只给了我 ID、NAME、TYPE、PRIMARY KEY、NOT NULL 和 DEFAULT VALUE
【问题讨论】:
我正在使用一个 sqlite 数据库,我想知道一个特定的列是 AUTOINCREMENT 还是 NOT
我试过了
PRAGMA table_info('table name') ;
但它只给了我 ID、NAME、TYPE、PRIMARY KEY、NOT NULL 和 DEFAULT VALUE
【问题讨论】:
查询
PRAGMA TABLE_INFO(yourtable);
可以获取主键列名。
判断是否为自增列,检查表是否有自增序列:
SELECT COUNT(*) FROM sqlite_sequence WHERE name='yourtable';
解读:
如果计数结果为非零,则表有一个自动增量主键列。
如果计数为零,则表为空且从未包含数据,或者没有自动增量主键列。
虽然SQLite documentation 似乎暗示在创建表时填充了 sqlite_sequence 表,但实际上并非如此,并且计数仅在插入数据后才可用。
【讨论】:
原谅我,因为我犯了罪:
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;
此查询基于两个假设:
autoincrement 标志出现在sqlite_master 内的列定义中
integer(目前 SQLite 需要)由于正则表达式没有开箱即用,因此此查询使用递归方法来匹配所有列。请原谅我。
您也可以在某些客户端中简单地处理您的sqlite_master.sql 内容,例如一个 Java 程序,使用简单的正则表达式,如果这对你来说更容易的话。
【讨论】: