目录
[2. SQLite 有哪些事务模式?](#2. SQLite 有哪些事务模式?)
[3.SQLite 支持高并发吗?](#3.SQLite 支持高并发吗?)
[4. WAL 是什么?](#4. WAL 是什么?)
[5. SQLite 分页怎么写?](#5. SQLite 分页怎么写?)
[6. SQLite 支持哪些 ALTER TABLE?](#6. SQLite 支持哪些 ALTER TABLE?)
[7. SQLite 支持索引吗?](#7. SQLite 支持索引吗?)
支持,而且事务具有 ACID 特性。
sql
BEGIN;
INSERT INTO users(name) VALUES ('Tom');
UPDATE users SET name = 'Jerry' WHERE id = 1;
COMMIT;
发生错误:
ROLLBACK;
事务的核心作用:
要么全部成功,要么全部失败。
2. SQLite 有哪些事务模式?
常见:
bash
BEGIN DEFERRED;
BEGIN IMMEDIATE;
BEGIN EXCLUSIVE;
简单理解:
DEFERRED:默认,开始事务时不立即获取写锁IMMEDIATE:立即尝试获取写事务资格EXCLUSIVE:获取更强的排他锁
3.SQLite 支持高并发吗?
SQLite 可以很好地支持并发读取,但一个数据库文件同一时间只有一个写入者,因此大量并发写入时容易成为瓶颈。
4. WAL 是什么?
提高并发读写性能,替代传统回滚日志
cpp
PRAGMA journal_mode=WAL;
5. SQLite 分页怎么写?
SELECT *
FROM users
LIMIT 20 OFFSET 40;
意思:
跳过 40 条,然后返回 20 条。
但大数据量下:
LIMIT 20 OFFSET 1000000
可能效率不好。
6. SQLite 支持哪些 ALTER TABLE?
现代 SQLite 支持:
bash
RENAME TABLE
RENAME COLUMN
ADD COLUMN
DROP COLUMN
7. SQLite 支持索引吗?
支持。
普通索引:
CREATE INDEX idx_user_name
ON users(name);
唯一索引:=普通索引 + 唯一性约束
CREATE UNIQUE INDEX idx_user_email
ON users(email);
联合索引:注意左前缀顺序
CREATE INDEX idx_user_name_age
ON users(name, age);
部分索引:只给满足某个条件的数据建立索引,而不是给整张表建立索引。
CREATE INDEX idx_active_user
ON users(name)
WHERE active = 1;
8.外键与触发器
- 外键(Foreign Key) :保证表与表之间的数据关系合法,比如
orders.user_id必须对应users.id;常用ON DELETE CASCADE实现父数据删除时自动删除子数据。SQLite 使用前要开启PRAGMA foreign_keys = ON。
- 触发器(Trigger) :当
INSERT / UPDATE / DELETE发生时,数据库自动执行指定 SQL,比如自动记录日志;通过NEW获取新数据、OLD获取旧数据。
