SQLite 常用命令及技巧 SQLite 简介 SQLite 是一个轻量级的嵌入式关系数据库,具有以下特点:
无需服务器,零配置
单个文件存储整个数据库
跨平台支持
支持大部分 SQL92 标准
适合小型应用、移动应用、嵌入式设备
连接与基本操作 安装 SQLite 1 2 3 4 5 6 7 8 brew install sqlite sudo apt-get install sqlite3
连接数据库 1 2 3 4 5 6 7 8 9 10 11 sqlite3 database.db sqlite3 :memory: sqlite3 database.db "SELECT * FROM table_name;" sqlite3 file:database.db?mode=ro
SQLite 命令行工具 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 .exit .quit .help .databases .tables .schema table_name .schema .indexes .indexes table_name .mode csv .mode column .mode html .mode insert .mode line .mode list .mode tabs .headers on .headers off .width 10 20 30 .output filename.txt .output stdout .read filename.sql .show .nullvalue NULL .prompt 'sqlite> ' .dump .dump table_name .import filename.csv table_name
数据库操作 创建数据库 1 2 sqlite3 new_database.db
附加数据库 1 2 3 4 5 6 7 8 ATTACH DATABASE 'another.db' AS alias_name; SELECT * FROM alias_name.table_name;DETACH DATABASE alias_name;
查看数据库信息 1 2 3 4 5 .databases SELECT file FROM pragma_database_list;
表操作 创建表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 CREATE TABLE table_name ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL , age INTEGER , email TEXT UNIQUE , created_at DATETIME DEFAULT CURRENT_TIMESTAMP ); CREATE TABLE IF NOT EXISTS table_name ( id INTEGER PRIMARY KEY, name TEXT ); CREATE TEMP TABLE temp_table ( id INTEGER , name TEXT ); CREATE TABLE new_table AS SELECT * FROM old_table;
SQLite 数据类型 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 CREATE TABLE types_demo ( col1 INT , col2 VARCHAR (255 ), col3 CHAR (10 ), col4 FLOAT , col5 BLOB , col6 NUMERIC );
查看表结构 1 2 3 4 5 6 7 8 9 10 11 .schema table_name PRAGMA table_info(table_name); SELECT name FROM sqlite_master WHERE type= 'table' ;SELECT sql FROM sqlite_master WHERE name= 'table_name' ;
修改表结构 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 ALTER TABLE old_name RENAME TO new_name;ALTER TABLE table_name ADD COLUMN column_name TEXT;ALTER TABLE table_name RENAME COLUMN old_name TO new_name;ALTER TABLE table_name DROP COLUMN column_name;BEGIN TRANSACTION;CREATE TABLE new_table ( id INTEGER PRIMARY KEY, name TEXT, new_column TEXT ); INSERT INTO new_table SELECT id, name, NULL FROM old_table;DROP TABLE old_table;ALTER TABLE new_table RENAME TO old_table;COMMIT ;
删除表 1 2 3 4 5 DROP TABLE table_name;DROP TABLE IF EXISTS table_name;
数据操作(CRUD) 插入数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 INSERT INTO table_name (column1, column2) VALUES (value1, value2);INSERT INTO table_name (column1, column2) VALUES (value1, value2), (value3, value4), (value5, value6); INSERT INTO table1 (column1, column2) SELECT column1, column2 FROM table2;INSERT OR REPLACE INTO table_name (id, name) VALUES (1 , 'New Name' );INSERT OR IGNORE INTO table_name (id, name) VALUES (1 , 'Name' );INSERT INTO table_name (id, name) VALUES (1 , 'Name' )ON CONFLICT(id) DO UPDATE SET name = excluded.name;
查询数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 SELECT * FROM table_name;SELECT column1, column2 FROM table_name;SELECT * FROM table_name WHERE condition ;SELECT * FROM table_name ORDER BY column1 ASC , column2 DESC ;SELECT * FROM table_name LIMIT 10 ;SELECT * FROM table_name LIMIT 10 OFFSET 20 ; SELECT column1, COUNT (* ) FROM table_name GROUP BY column1;SELECT column1, COUNT (* ) FROM table_name GROUP BY column1 HAVING COUNT (* ) > 1 ;SELECT DISTINCT column1 FROM table_name;SELECT column1 AS alias_name FROM table_name;
更新数据 1 2 3 4 5 6 7 8 9 10 11 12 UPDATE table_name SET column1 = value1, column2 = value2 WHERE condition ;UPDATE table_name SET column1 = value1 WHERE id IN (1 , 2 , 3 );UPDATE table_name SET status = CASE WHEN age < 18 THEN 'minor' WHEN age >= 18 THEN 'adult' END ;
删除数据 1 2 3 4 5 6 7 8 9 DELETE FROM table_name WHERE condition ;DELETE FROM table_name;DELETE FROM sqlite_sequence WHERE name= 'table_name' ;DELETE FROM table_name;
高级查询 连接查询 1 2 3 4 5 6 7 8 9 10 11 12 13 SELECT * FROM table1 INNER JOIN table2 ON table1.id = table2.table1_id;SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.table1_id;SELECT * FROM table1 NATURAL JOIN table2;SELECT a.* , b.* FROM table1 a, table1 b WHERE a.parent_id = b.id;
子查询 1 2 3 4 5 6 7 8 9 10 11 12 13 14 SELECT * FROM table1 WHERE id IN (SELECT table1_id FROM table2);SELECT * FROM (SELECT * FROM table1 WHERE condition ) AS temp;SELECT * FROM table1 WHERE EXISTS ( SELECT 1 FROM table2 WHERE table2.table1_id = table1.id ); SELECT name, (SELECT COUNT (* ) FROM orders WHERE customer_id = customers.id) FROM customers;
联合查询 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 SELECT column1 FROM table1UNION SELECT column1 FROM table2;SELECT column1 FROM table1UNION ALL SELECT column1 FROM table2;SELECT column1 FROM table1INTERSECT SELECT column1 FROM table2;SELECT column1 FROM table1EXCEPT SELECT column1 FROM table2;
CTE(公用表表达式) 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 WITH cte_name AS ( SELECT * FROM table_name WHERE condition ) SELECT * FROM cte_name;WITH cte1 AS (SELECT * FROM table1), cte2 AS (SELECT * FROM table2) SELECT * FROM cte1 JOIN cte2 ON cte1.id = cte2.id;WITH RECURSIVE cte_name AS ( SELECT id, parent_id, name FROM tree WHERE parent_id IS NULL UNION ALL SELECT t.id, t.parent_id, t.name FROM tree t JOIN cte_name c ON t.parent_id = c.id ) SELECT * FROM cte_name;
索引操作 创建索引 1 2 3 4 5 6 7 8 9 10 11 12 13 14 CREATE INDEX index_name ON table_name (column_name);CREATE UNIQUE INDEX unique_index_name ON table_name (column_name);CREATE INDEX index_name ON table_name (column1, column2);CREATE INDEX index_name ON table_name (column_name) WHERE condition ;CREATE INDEX index_name ON table_name (UPPER (column_name));
查看索引 1 2 3 4 5 6 7 8 9 10 11 .indexes PRAGMA index_list(table_name); PRAGMA index_info(index_name); SELECT sql FROM sqlite_master WHERE type= 'index' AND name= 'index_name' ;
删除索引 1 2 3 4 5 DROP INDEX index_name;DROP INDEX IF EXISTS index_name;
重建索引 1 2 3 4 REINDEX; REINDEX index_name; REINDEX table_name;
触发器 创建触发器 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 CREATE TRIGGER trigger_nameAFTER INSERT ON table_name BEGIN INSERT INTO log_table (action, record_id) VALUES ('INSERT' , NEW.id); END ;CREATE TRIGGER trigger_nameBEFORE UPDATE ON table_name WHEN OLD.status != NEW.statusBEGIN INSERT INTO log_table (action, old_value, new_value) VALUES ('UPDATE' , OLD.status, NEW.status); END ;CREATE TRIGGER trigger_nameAFTER DELETE ON table_name BEGIN INSERT INTO log_table (action, record_id) VALUES ('DELETE' , OLD.id); END ;CREATE TRIGGER trigger_nameINSTEAD OF INSERT ON view_name BEGIN INSERT INTO table_name (column1, column2) VALUES (NEW.column1, NEW.column2); END ;
查看触发器 1 2 3 4 5 SELECT name FROM sqlite_master WHERE type= 'trigger' ;SELECT name, sql FROM sqlite_master WHERE type= 'trigger' AND tbl_name= 'table_name' ;
删除触发器 1 2 3 4 5 DROP TRIGGER trigger_name;DROP TRIGGER IF EXISTS trigger_name;
视图 创建视图 1 2 3 4 5 6 7 8 9 10 11 CREATE VIEW view_name AS SELECT column1, column2 FROM table_name WHERE condition ;CREATE VIEW IF NOT EXISTS view_name AS SELECT * FROM table_name;CREATE TEMP VIEW temp_view AS SELECT * FROM table_name;
查看视图 1 2 3 4 5 SELECT name FROM sqlite_master WHERE type= 'view' ;SELECT sql FROM sqlite_master WHERE type= 'view' AND name= 'view_name' ;
删除视图 1 2 3 4 5 DROP VIEW view_name;DROP VIEW IF EXISTS view_name;
事务 事务操作 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 BEGIN TRANSACTION;BEGIN ;COMMIT ;END TRANSACTION;ROLLBACK ;SAVEPOINT savepoint_name;ROLLBACK TO SAVEPOINT savepoint_name;RELEASE SAVEPOINT savepoint_name;
事务隔离 1 2 3 4 5 6 7 8 PRAGMA read_uncommitted = true ; PRAGMA read_uncommitted;
锁定模式 1 2 3 4 5 6 PRAGMA locking_mode = EXCLUSIVE; PRAGMA locking_mode = NORMAL; PRAGMA locking_mode;
PRAGMA 命令 数据库配置 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 SELECT sqlite_version();PRAGMA foreign_keys = ON ; PRAGMA foreign_keys = OFF; PRAGMA foreign_keys; PRAGMA auto_vacuum = FULL ; PRAGMA auto_vacuum = INCREMENTAL; PRAGMA auto_vacuum = NONE ; PRAGMA cache_size = 10000 ; PRAGMA page_size = 4096 ; PRAGMA synchronous = FULL ; PRAGMA synchronous = NORMAL; PRAGMA synchronous = OFF; PRAGMA journal_mode = DELETE ; PRAGMA journal_mode = WAL; PRAGMA journal_mode = MEMORY; PRAGMA journal_mode = OFF; PRAGMA database_list; PRAGMA page_count; SELECT page_count * page_size / 1024.0 / 1024.0 AS size_mb FROM pragma_page_count;
表信息 1 2 3 4 5 6 7 8 9 10 11 12 13 14 PRAGMA table_info(table_name); PRAGMA table_xinfo(table_name); PRAGMA index_list(table_name); PRAGMA index_info(index_name); PRAGMA foreign_key_list(table_name);
性能优化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 PRAGMA optimize; ANALYZE; ANALYZE table_name; VACUUM; PRAGMA incremental_vacuum(100 ); PRAGMA integrity_check; PRAGMA integrity_check(table_name); PRAGMA quick_check;
备份与恢复 数据库备份 1 2 3 4 5 6 7 8 9 10 11 12 13 14 cp database.db database_backup.dbsqlite3 database.db .dump > backup.sql sqlite3 database.db ".dump table_name" > table_backup.sql sqlite3 database.db ".backup backup.db" .backup main backup.db
数据库恢复 1 2 3 4 5 6 7 8 sqlite3 new_database.db < backup.sql .read backup.sql cp backup.db database.db
导出特定格式 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 sqlite3 database.db <<EOF .headers on .mode csv .output data.csv SELECT * FROM table_name; EOF sqlite3 database.db <<EOF .mode json .output data.json SELECT * FROM table_name; EOF sqlite3 database.db <<EOF .mode html .output data.html SELECT * FROM table_name; EOF
导入数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 sqlite3 database.db <<EOF .mode csv .import data.csv table_name EOF sqlite3 database.db <<EOF .mode csv .headers on .import data.csv table_name EOF sqlite3 database.db <<EOF .mode tabs .import data.txt table_name EOF
常用函数 字符串函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 SELECT 'Hello' || ' ' || 'World' ;SELECT LENGTH('Hello' );SELECT UPPER ('hello' );SELECT LOWER ('HELLO' );SELECT SUBSTR('Hello World' , 1 , 5 );SELECT REPLACE('Hello World' , 'World' , 'SQLite' );SELECT TRIM (' Hello ' );SELECT LTRIM(' Hello' );SELECT RTRIM('Hello ' );SELECT INSTR('Hello World' , 'World' );SELECT PRINTF('%s has %d apples' , 'John' , 5 );
数值函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 SELECT ROUND(3.14159 , 2 ); SELECT CEIL (3.14 ); SELECT CAST (3.14 AS INTEGER ) + (3.14 > CAST (3.14 AS INTEGER ));SELECT FLOOR (3.14 ); SELECT CAST (3.14 AS INTEGER );SELECT ABS (-10 ); SELECT 10 % 3 ; SELECT RANDOM(); SELECT ABS (RANDOM() % 100 ); SELECT POWER (2 , 3 ); SELECT SQRT (16 );
日期时间函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 SELECT DATE ('now' ); SELECT TIME ('now' ); SELECT DATETIME('now' ); SELECT JULIANDAY('now' ); SELECT STRFTIME('%Y-%m-%d %H:%M:%S' , 'now' );SELECT STRFTIME('%Y年%m月%d日' , 'now' );SELECT DATE ('now' , '+7 days' );SELECT DATE ('now' , '-1 month' );SELECT DATE ('now' , '+1 year' , '+3 months' , '-1 day' );SELECT JULIANDAY('2024-12-31' ) - JULIANDAY('2024-01-01' );SELECT STRFTIME('%Y' , 'now' ); SELECT STRFTIME('%m' , 'now' ); SELECT STRFTIME('%d' , 'now' ); SELECT STRFTIME('%H' , 'now' ); SELECT STRFTIME('%M' , 'now' ); SELECT STRFTIME('%S' , 'now' ); SELECT STRFTIME('%w' , 'now' ); SELECT STRFTIME('%j' , 'now' ); SELECT STRFTIME('%W' , 'now' ); SELECT DATE ('2024-01-01 12:30:45' ); SELECT TIME ('2024-01-01 12:30:45' );
聚合函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 SELECT COUNT (* ) FROM table_name;SELECT COUNT (column_name) FROM table_name; SELECT SUM (column_name) FROM table_name;SELECT AVG (column_name) FROM table_name;SELECT MAX (column_name) FROM table_name;SELECT MIN (column_name) FROM table_name;SELECT GROUP_CONCAT(column_name) FROM table_name;SELECT GROUP_CONCAT(column_name, ', ' ) FROM table_name;SELECT COUNT (DISTINCT column_name) FROM table_name;
条件函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 SELECT name, CASE WHEN age < 18 THEN 'minor' WHEN age >= 18 AND age < 65 THEN 'adult' ELSE 'senior' END AS age_group FROM users;SELECT IIF(age >= 18 , 'adult' , 'minor' ) FROM users;SELECT COALESCE (NULL , NULL , 'default' );SELECT NULLIF (value , 0 );
类型转换 1 2 3 4 5 6 7 8 9 10 11 SELECT CAST ('123' AS INTEGER );SELECT CAST (123.45 AS TEXT);SELECT CAST (123 AS REAL );SELECT TYPEOF(123 ); SELECT TYPEOF(123.45 ); SELECT TYPEOF('hello' ); SELECT TYPEOF(X'0102' ); SELECT TYPEOF(NULL );
JSON 支持(SQLite 3.38.0+) JSON 函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 SELECT JSON('{"name": "John", "age": 30}' );SELECT JSON_EXTRACT('{"name": "John"}' , '$.name' );SELECT JSON_EXTRACT('{"user": {"name": "John"}}' , '$.user.name' );SELECT '{"name": "John"}' - > '$.name' ;SELECT '{"user": {"name": "John"}}' - >> '$.user.name' ;SELECT JSON_OBJECT ('name' , 'John' , 'age' , 30 );SELECT JSON_ARRAY (1 , 2 , 3 , 'four' );SELECT JSON_TYPE('{"name": "John"}' ); SELECT JSON_TYPE('[1, 2, 3]' ); SELECT JSON_ARRAY_LENGTH('[1, 2, 3, 4]' );SELECT JSON_INSERT('{"name": "John"}' , '$.age' , 30 );SELECT JSON_REPLACE('{"name": "John", "age": 25}' , '$.age' , 30 );SELECT JSON_REMOVE('{"name": "John", "age": 30}' , '$.age' );SELECT JSON_VALID('{"name": "John"}' ); SELECT JSON_VALID('invalid json' );
全文搜索(FTS) 创建FTS表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 CREATE VIRTUAL TABLE posts_fts USING fts4(title, content);CREATE VIRTUAL TABLE posts_fts USING fts5(title, content);INSERT INTO posts_fts (title, content) VALUES ('Title' , 'Content text' );SELECT * FROM posts_fts WHERE posts_fts MATCH 'search term' ;SELECT * FROM posts_fts WHERE posts_fts MATCH 'title:search' ;SELECT * FROM posts_fts WHERE posts_fts MATCH 'search*' ;SELECT * FROM posts_fts WHERE posts_fts MATCH 'term1 AND term2' ;SELECT * FROM posts_fts WHERE posts_fts MATCH 'term1 OR term2' ;SELECT * FROM posts_fts WHERE posts_fts MATCH 'term1 NOT term2' ;SELECT * FROM posts_fts WHERE posts_fts MATCH 'search' ORDER BY rank;
性能优化 查询优化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 EXPLAIN QUERY PLAN SELECT * FROM table_name WHERE condition ; CREATE INDEX idx_cover ON table_name(column1, column2);SELECT column1, column2 FROM table_name WHERE column1 = 'value' ;SELECT column1, column2 FROM table_name;SELECT * FROM table_name LIMIT 100 ;BEGIN TRANSACTION;INSERT INTO table_name VALUES (...);INSERT INTO table_name VALUES (...);COMMIT ;PREPARE stmt FROM 'INSERT INTO table_name VALUES (?, ?)' ;EXECUTE stmt USING value1, value2;
数据库优化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ANALYZE; PRAGMA optimize; VACUUM; PRAGMA journal_mode = WAL; PRAGMA cache_size = -64000 ; PRAGMA synchronous = NORMAL; PRAGMA temp_store = MEMORY;
索引优化 1 2 3 4 5 6 7 8 9 10 11 12 13 14 EXPLAIN QUERY PLAN SELECT * FROM table_name WHERE column = 'value' ; CREATE INDEX idx_composite ON table_name(column1, column2);CREATE INDEX idx_active ON table_name(column ) WHERE active = 1 ;REINDEX; SELECT * FROM sqlite_stat1;
常见问题解决 数据库锁定 1 2 3 4 5 6 7 8 SELECT * FROM sqlite_status;PRAGMA busy_timeout = 5000 ; PRAGMA journal_mode = WAL;
数据库损坏 1 2 3 4 5 6 7 8 9 10 11 PRAGMA integrity_check; .dump > backup.sql sqlite3 new.db < backup.sql
性能问题 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 PRAGMA page_count; PRAGMA page_size; SELECT page_count * page_size / 1024.0 / 1024.0 AS size_mb FROM pragma_page_count;SELECT name, (pgsize * pgcount) / 1024.0 / 1024.0 AS size_mb FROM ( SELECT name, (SELECT pgsize FROM pragma_page_size) AS pgsize, (SELECT pgcount FROM pragma_page_count) AS pgcount FROM sqlite_master WHERE type= 'table' ); SELECT * FROM sqlite_stat1;
自增ID重置 1 2 3 4 5 6 7 8 SELECT * FROM sqlite_sequence;DELETE FROM sqlite_sequence WHERE name= 'table_name' ;INSERT INTO sqlite_sequence (name, seq) VALUES ('table_name' , 100 );
实用技巧 批量操作 1 2 3 4 5 6 7 8 9 10 11 12 INSERT INTO table_name SELECT * FROM source_table;UPDATE table_name SET column = value WHERE id IN ( SELECT id FROM another_table WHERE condition ); DELETE FROM table_name WHERE id IN ( SELECT id FROM another_table WHERE condition );
数据去重 1 2 3 4 5 6 7 8 9 10 DELETE FROM table_name WHERE rowid NOT IN ( SELECT MAX (rowid) FROM table_name GROUP BY column1, column2 ); CREATE TABLE temp AS SELECT DISTINCT * FROM table_name;DROP TABLE table_name;ALTER TABLE temp RENAME TO table_name;
分页查询 1 2 3 4 5 6 7 8 SELECT * FROM table_name LIMIT 10 OFFSET 20 ;SELECT * FROM table_name WHERE id > last_id ORDER BY id LIMIT 10 ;
行号生成 1 2 3 4 5 6 7 8 9 10 SELECT ROWID, * FROM table_name;SELECT ROW_NUMBER () OVER (ORDER BY column ) AS row_num, * FROM table_name;SELECT (SELECT COUNT (* ) FROM table_name t2 WHERE t2.id <= t1.id) AS row_num, * FROM table_name t1;
生成测试数据 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 WITH RECURSIVE cnt(x) AS ( SELECT 1 UNION ALL SELECT x + 1 FROM cnt WHERE x < 100 ) SELECT x FROM cnt;WITH RECURSIVE cnt(x) AS ( SELECT 1 UNION ALL SELECT x + 1 FROM cnt WHERE x < 100 ) SELECT x AS id, 'User' || x AS name, ABS (RANDOM() % 100 ) AS age FROM cnt;
与其他数据库对比 SQLite vs MySQL
特性
SQLite
MySQL
架构
嵌入式
客户端/服务器
配置
零配置
需要配置
并发
读并发,写串行
高并发
用户管理
无
完整权限系统
存储过程
不支持
支持
触发器
支持
支持
视图
支持(只读)
支持(可更新)
适用场景
小型应用、移动应用
大型应用、Web应用
SQLite vs PostgreSQL
特性
SQLite
PostgreSQL
数据类型
动态类型
强类型
JSON支持
基础支持
强大支持
全文搜索
FTS扩展
内置
数组类型
不支持
支持
窗口函数
支持(3.25.0+)
完整支持
事务隔离
SERIALIZABLE
多级别
适用场景
嵌入式、测试
企业级应用
最佳实践 设计原则
合理使用索引 :为常用查询条件创建索引
避免过度规范化 :SQLite适合适度冗余的设计
使用事务 :批量操作使用事务提高性能
选择合适的数据类型 :利用SQLite的动态类型特性
定期维护 :执行VACUUM和ANALYZE
性能建议
使用WAL模式 :提高并发性能
批量操作 :使用事务包裹多个写操作
预编译语句 :重复执行的SQL使用预编译
合理设置缓存 :根据内存情况调整cache_size
避免大事务 :长时间运行的事务会影响并发
安全建议
参数化查询 :防止SQL注入
输入验证 :验证所有用户输入
文件权限 :设置适当的数据库文件权限
加密 :使用SQLCipher加密敏感数据
备份 :定期备份数据库文件
总结 本文全面介绍了SQLite数据库的常用命令和技巧,包括:
基本操作和命令行工具
数据库和表的管理
数据操作(CRUD)
高级查询特性
索引、触发器、视图
事务和并发控制
备份与恢复
性能优化
JSON和全文搜索支持
常见问题解决方案
SQLite作为轻量级数据库,适合小型应用、移动应用、嵌入式设备和测试环境。掌握这些命令和技巧,可以更高效地使用SQLite数据库。