使用SQL語句獲取SQLite中的表定義
1. 問題提出
有人問,在sqlite中怎麼用sql語句得到一個表的列定義語句。第一反應,可能就是用.schema <tablename>
可是這是sqlite的shell命令列。
使用程式碼,好像得不到結果。
幸好,sqlite它有比較特殊的系統表:
sqlite_master
sqlite_temp_master
這兩張系統表的表結構完全相同,如下所示:
sqlite> .schema sqlite_master
CREATE TABLE sqlite_master (
type text,
name text,
tbl_name text,
rootpage integer,
sql text
);
sqlite> .schema sqlite_temp_master
CREATE TEMP TABLE sqlite_temp_master (
type text,
name text,
tbl_name text,
rootpage integer,
sql text
);
2. 例項說明
我們通過例項來說明,看看.schema相當於什麼樣的sql語句執行結果:
sqlite> create table t(id int);
sqlite> create temporary table t(id int, col2 varchar(32));
sqlite> insert into t values(1);
Error: table t has 2 columns but 1 values were supplied
sqlite> drop table t;
sqlite> .tables
t
sqlite> insert into t values(1);
sqlite> create temporary table t(id int, col2 varchar(32));
sqlite> insert into t values(2, 'wang');
sqlite> .schema t
CREATE TABLE t(id int);
CREATE TABLE t(id int, col2 varchar(32));
sqlite> select sql from sqlite_master where tbl_name='t';
CREATE TABLE t(id int)
sqlite> select sql from sqlite_temp_master where tbl_name='t';
CREATE TABLE t(id int, col2 varchar(32))
sqlite> select sql from sqlite_master where tbl_name='t' and type='table' union all select sql from
sqlite_temp_master where tbl_name='t' and type='table';
CREATE TABLE t(id int)
CREATE TABLE t(id int, col2 varchar(32))
sqlite>
我們看到,建立了兩個表,都叫t, 一個是臨時表,一個是非臨時的。建立完以後,在插入資料時,它優先認可臨時表。
當我們執行.schema t時,會把兩張表都列出來。
然後通過查詢sqlite_master中的sql欄位可以得到非臨時表的建表資訊,sqlite_temp_master中的sql欄位能得到臨時表的資訊。兩者的union就會得到所有表的資訊。
所以:
.schema <t>
等價於:
select sql from sqlite_master where tbl_name='<t>' and type='table' union all select sql from
sqlite_temp_master where tbl_name='<t>' and type='table';
值得一提的是,當type='index'時,還可以得到index的相關建立語句,不再綴述。
相關文章
- 觸發器中獲取SQL語句觸發器SQL
- 常用的Sqlite SQL語句(持續更新中)SQLite
- 使用SQL語句從資料庫一個表中隨機獲取資料SQL資料庫隨機
- Laravel 獲取執行的sql語句LaravelSQL
- 批量獲取表定義的方法
- mysql 還原表的定義語句MySql
- informix SQL語句斷點定義ORMSQL斷點
- sql 中的with 語句使用SQL
- [Sqlite] Sqlite的基本日常SQL操作語句彙總SQLite
- 使用mysqlsniffer捕獲SQL語句MySql
- oracle之 獲取建表ddl語句Oracle
- Android原生SQLite常用SQL語句AndroidSQLite
- SQLite SQL語句結構詳解SQLite
- SQLite中特殊的INSERT語句SQLite
- SQL Server中獲取資料庫名、表名、欄位名和欄位註釋的SQL語句SQLServer資料庫
- 定時生成分月表sql語句SQL
- Mysql 獲取表設計查詢語句MySql
- Oracle中獲取TABLE的DDL語句的方法Oracle
- js獲取非內部取樣式表中定義的屬性值JS
- SQLite語句(一):表的操作和約束SQLite
- SQLite的Pragma語句SQLite
- oracle自定義過程來獲得完整的sql語句OracleSQL
- js如何獲取樣式表中定義的css屬性值JSCSS
- 使用 EXPLAIN PLAN 獲取SQL語句執行計劃 (R0.1)AISQL
- PostgreSQL獲取建表語句儲存過程SQL儲存過程
- 【原】獲取SQLServer的最完整資料字典的SQL語句SQLServer
- Sql建表語句SQL
- sql 建表語句SQL
- sql語句建立表SQL
- Oracle 獲取ddl語句Oracle
- SQL SERVER 2005 獲取表的所有索引資訊以及刪除和新建語句SQLServer索引
- 教你使用SQLite-insert語句SQLite
- 使用SQL MERGE語句組合表SQL
- 獲取oracle正在處於等待狀態的sql語句的執行計劃的語句OracleSQL
- Oracle獲取資料庫中的物件建立語句Oracle資料庫物件
- 【轉義】使用SQL生成SQL語句時單引號的轉義處理SQL
- 獲取物件DDL語句的方法物件
- 獲取物件的構建語句物件