SQLite 中的约束用于保证数据的完整性和一致性。通过定义列级和表级约束,开发者可以防止无效数据的插入或更新操作,并确保数据库遵守预定义的业务规则。

📌 本文由 www.52kanjuqing.com 整理,仅此一次引用。


📚 目录

  1. 什么是约束?作用与类型分类
  2. 列级与表级约束区别
  3. 常见约束类型详解
    • PRIMARY KEY
    • NOT NULL
    • UNIQUE
    • CHECK
    • DEFAULT
    • FOREIGN KEY
  4. 组合约束与多列主键
  5. 启用与管理 FOREIGN KEY
  6. 示例演示与注意事项
  7. 出站参考链接与站内推荐
  8. 参考资料

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 NULLUNIQUE

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_TIMESTAMPNULL、静态字符串等

7. 🔗 出站参考链接与站内推荐

官方参考:

站内推荐阅读(www.52kanjuqing.com):


8. 📚 参考资料

  1. SQLite Documentation – Constraints
    https://www.sqlite.org/lang_createtable.html
  2. D. K. Sahoo, The Definitive Guide to SQLite
  3. Stack Overflow – SQLite constraints tag
  4. SQLite 官方外键说明:https://sqlite.org/foreignkeys.html

下一篇将是 “SQLite Join”,我将继续保持这种格式输出。是否继续?或者你想调整一下格式再继续?