SQLite的System Catalogs

2020年10月28日 / 3次阅读 / Last Modified 2020年10月28日
SQLite

System Catalog就是数据库系统自己记录的数据,每个数据库里面都有。SQLite数据库中,所有以sqlite_开头的表,都是这一类。

这些table基本都是read-only,可以用select读,如果你遇到一个不知道内部结构的数据库,查看system catalog表是个不错的开始。

所有非临时的SQLite数据库,都有sqlite_master表,它记录了所有数据库中的对象,它也是最重要的。

sqlite_master表
sqlite_master表

如果有 AUTOINCREMENT 列,sqlite_master中被自动创建一个 sqlite_sequence 表,来记录一些需要的数据:

sqlite> create table aa(id integer primary key);
sqlite> select * from sqlite_master;
table|aa|aa|2|CREATE TABLE aa(id integer primary key)
sqlite> .mode column
sqlite> select * from sqlite_master;
type   name  tbl_name  rootpage  sql
-----  ----  --------  --------  ---------------------------------------
table  aa    aa        2         CREATE TABLE aa(id integer primary key)
sqlite>
sqlite> create table bb(id integer primary key autoincrement);
sqlite> select * from sqlite_master;
type   name             tbl_name         rootpage  sql
-----  ---------------  ---------------  --------  -----------------------------------------------------
table  aa               aa               2         CREATE TABLE aa(id integer primary key)
table  bb               bb               3         CREATE TABLE bb(id integer primary key autoincrement)
table  sqlite_sequence  sqlite_sequence  4         CREATE TABLE sqlite_sequence(name,seq)

注意:用 integer primary key,不会产生默认的index,这就是 integer primary key特殊的地方,具体可以参考: sqlite3允许primary key为null,但有例外

如果用其它方式创建主键,默认会产生一个index,通过sqlite_master就能够清晰的看到:

sqlite> create table t3(id int primary key not null);
sqlite> select * from sqlite_master;
table|t3|t3|2|CREATE TABLE t3(id int primary key not null)
index|sqlite_autoindex_t3_1|t3|3|
sqlite> .mode column
sqlite> select * from sqlite_master;
type   name                   tbl_name  rootpage  sql
-----  ---------------------  --------  --------  --------------------------------------------
table  t3                     t3        2         CREATE TABLE t3(id int primary key not null)
index  sqlite_autoindex_t3_1  t3        3

如果用过 ANALYZE 语句,还会产生 sqlite_stat# 表格。

临时的table不在sqlite_master中,他们在sqlite_temp_master中。

-- EOF --

本文链接:https://www.pynote.net/archives/2674

留言区

电子邮件地址不会被公开。 必填项已用*标注


前一篇:
后一篇:

More


©Copyright 麦新杰 Since 2019 Python笔记

go to top