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;
3条答案
按热度按时间j9per5c41#
使用查询
可以获取主键列名。
要检查它是否为自动增量列,请检查表是否具有自动增量序列:
解读:
虽然SQLite documentation似乎暗示在创建sqlite_sequence表时填充该表,但实际上并非如此,只有在插入数据后计数才可用。
o4hqfura2#
原谅我,我犯了罪:
此查询基于两个假设:
autoincrement
标志出现在sqlite_master
内的列定义中1.该列的类型为
integer
(SQLite当前所需的类型)由于正则表达式不能直接使用,所以此查询使用递归方法来匹配所有列。请原谅。
当然...
您也可以在某个客户端(例如Java程序)中使用简单的正则表达式简单地处理
sqlite_master.sql
内容,如果这对您来说更容易的话。h6my8fg23#
有一个线程从山姆和正弦在这个职位See Thread
基于此逻辑,您可以使用
SELECT "is-autoincrement" FROM sqlite_master WHERE tbl_name="<your-table-name>" AND sql LIKE "%AUTOINCREMENT%"
正如帖子中提到的。它对我很有效。虽然不确定它的可靠性。