SQLite 中的约束用于保证数据的完整性和一致性。通过定义列级和表级约束,开发者可以防止无效数据的插入或更新操作,并确保数据库遵守预定义的业务规则。
📌 本文由 www.52kanjuqing.com 整理,仅此一次引用。
📚 目录
- 什么是约束?作用与类型分类
- 列级与表级约束区别
- 常见约束类型详解
- PRIMARY KEY
- NOT NULL
- UNIQUE
- CHECK
- DEFAULT
- FOREIGN KEY
- 组合约束与多列主键
- 启用与管理 FOREIGN KEY
- 示例演示与注意事项
- 出站参考链接与站内推荐
- 参考资料
1. 什么是约束?
约束(Constraint) 是在创建表时定义的一种规则,用于自动验证数据的合法性,防止出现非法、重复、冲突或违反关系逻辑的情况。
SQLite 支持标准 SQL 的主要约束类型,并且提供灵活的语法来结合使用这些约束。
2. 列级与表级约束
类型 | 描述 |
---|---|
列级约束 | 定义在字段名之后,作用于单个列 |
表级约束 | 定义在所有列之后,可以作用于多个字段组合 |
-- 列级约束
CREATE TABLE users (
id INTEGER PRIMARY KEY,
email TEXT UNIQUE
);
-- 表级外键约束
CREATE TABLE orders (
id INTEGER PRIMARY KEY,
user_id INTEGER,
FOREIGN KEY(user_id) REFERENCES users(id)
);
3. 常见约束类型详解
🧩 PRIMARY KEY
用于唯一标识一行记录,默认隐含 NOT NULL
和 UNIQUE
:
id INTEGER PRIMARY KEY
支持复合主键(表级定义):
PRIMARY KEY (first_name, last_name)
❗ NOT NULL
强制字段不能为空:
name TEXT NOT NULL
🔁 UNIQUE
确保字段值全表唯一:
email TEXT UNIQUE
可用于多字段唯一组合(表级):
UNIQUE (first_name, last_name)
✅ CHECK
添加逻辑验证条件(表达式结果为 TRUE 才可通过):
age INTEGER CHECK(age >= 18)
🧬 DEFAULT
设置字段默认值,适用于插入语句未提供字段值时使用:
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
🔗 FOREIGN KEY
用于建立表之间的引用关系:
user_id INTEGER REFERENCES users(id)
也可以设置联动行为:
FOREIGN KEY(user_id) REFERENCES users(id)
ON DELETE CASCADE
ON UPDATE SET NULL
⚠️ SQLite 默认关闭外键支持,需手动启用:
PRAGMA foreign_keys = ON;
4. 组合约束与多列主键
复合约束定义方式为表级定义:
CREATE TABLE enrollments (
student_id INTEGER,
course_id INTEGER,
PRIMARY KEY (student_id, course_id)
);
组合 UNIQUE + CHECK
:
UNIQUE (username, email),
CHECK (length(password) >= 8)
5. 启用与管理 FOREIGN KEY
启用方式:
PRAGMA foreign_keys = ON;
检查当前是否启用:
PRAGMA foreign_keys;
验证引用关系:
PRAGMA foreign_key_check;
6. 示例演示与注意事项
完整表定义示例:
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE,
age INTEGER CHECK(age >= 18),
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
注意事项:
- SQLite 不强制类型(弱类型),需用约束加以控制
- FOREIGN KEY 必须与目标表字段类型完全一致
- CHECK 子句对旧版本 SQLite(3.3 之前)无效
- 默认值可以使用
CURRENT_TIMESTAMP
、NULL
、静态字符串等
7. 🔗 出站参考链接与站内推荐
官方参考:
站内推荐阅读(www.52kanjuqing.com):
8. 📚 参考资料
- SQLite Documentation – Constraints
https://www.sqlite.org/lang_createtable.html - D. K. Sahoo, The Definitive Guide to SQLite
- Stack Overflow – SQLite constraints tag
- SQLite 官方外键说明:https://sqlite.org/foreignkeys.html
下一篇将是 “SQLite Join”,我将继续保持这种格式输出。是否继续?或者你想调整一下格式再继续?
发表回复