SQLite 约束
在 SQLite 中,约束(Constraint)用于确保数据库中的数据完整性和一致性。SQLite 支持多种约束类型,常见的约束包括 NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK 和 DEFAULT。
1. SQLite 约束类型
1.1 NOT NULL 约束
- 确保某个字段不能为空。
- 适用于
INSERT或UPDATE操作,若未提供值或提供NULL,会报错。
示例:
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
email TEXT
);
name列必须有值,否则插入数据时会失败。
1.2 UNIQUE 约束
- 确保某列的值在表中是唯一的。
- 可以用于单列或多列组合。
示例:
CREATE TABLE users (
id INTEGER PRIMARY KEY,
email TEXT UNIQUE
);
email列的值不能重复。
多列组合 UNIQUE
CREATE TABLE orders (
order_id INTEGER,
product_id INTEGER,
quantity INTEGER,
UNIQUE(order_id, product_id)
);
- 这意味着
(order_id, product_id)组合必须唯一。
1.3 PRIMARY KEY(主键)约束
- 作用类似于
UNIQUE,但必须是 非 NULL 且自动索引。 - 通常用于唯一标识一行数据。
示例:
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
id列是主键,每行的id值必须唯一且不能为空。
自动递增主键(AUTOINCREMENT)
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL
);
id列会自动递增,但AUTOINCREMENT可能影响性能,因此仅在需要严格连续 ID 时使用。
1.4 FOREIGN KEY(外键)约束
- 用于建立表之间的关系,确保数据一致性。
- 需要
PRAGMA foreign_keys = ON;启用外键支持。
示例:
PRAGMA foreign_keys = ON;
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
CREATE TABLE orders (
order_id INTEGER PRIMARY KEY,
user_id INTEGER,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
orders.user_id必须是users.id中的一个值。ON DELETE CASCADE使得当users表中的id被删除时,相关的orders记录也会被删除。
1.5 CHECK 约束
- 用于限制列的取值范围,确保符合条件。
示例:
CREATE TABLE products (
id INTEGER PRIMARY KEY,
price REAL CHECK (price > 0),
stock INTEGER CHECK (stock >= 0)
);
price必须大于 0,stock不能为负数,否则插入/更新数据时会报错。
1.6 DEFAULT 约束
- 设定默认值,如果
INSERT语句未提供值,则使用默认值。
示例:
CREATE TABLE users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
created_at默认存储当前时间。
2. 组合多个约束
可以在同一列上使用多个约束,例如:
CREATE TABLE employees (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE,
salary REAL CHECK (salary >= 3000) DEFAULT 3000
);
id是主键,自动递增;name不能为空;email必须唯一;salary不能低于 3000,默认值为 3000。
3. 删除约束
SQLite 不支持 直接删除已有表的约束。要修改约束,需要:
- 创建一个新表(包含新的约束)。
- 复制数据到新表。
- 删除旧表。
- 重命名新表。
示例:
BEGIN TRANSACTION;
CREATE TABLE new_users (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL
);
INSERT INTO new_users SELECT id, name FROM users;
DROP TABLE users;
ALTER TABLE new_users RENAME TO users;
COMMIT;
4. 结论
- SQLite 提供
NOT NULL、UNIQUE、PRIMARY KEY、FOREIGN KEY、CHECK和DEFAULT等约束来保证数据完整性。 - 不能直接删除约束,只能通过重建表的方式修改约束。
- 使用
PRAGMA foreign_keys = ON;以确保外键约束生效。
更多详细内容请关注其他相关文章。