SQLite 约束
                           
天天向上
发布: 2025-03-04 19:24:15

原创
820 人浏览过

在 SQLite 中,约束(Constraint)用于确保数据库中的数据完整性和一致性。SQLite 支持多种约束类型,常见的约束包括 NOT NULLUNIQUEPRIMARY KEYFOREIGN KEYCHECKDEFAULT


1. SQLite 约束类型

1.1 NOT NULL 约束

  • 确保某个字段不能为空。
  • 适用于 INSERTUPDATE 操作,若未提供值或提供 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 不支持 直接删除已有表的约束。要修改约束,需要:

  1. 创建一个新表(包含新的约束)。
  2. 复制数据到新表。
  3. 删除旧表。
  4. 重命名新表。

示例:

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 NULLUNIQUEPRIMARY KEYFOREIGN KEYCHECKDEFAULT 等约束来保证数据完整性。
  • 不能直接删除约束,只能通过重建表的方式修改约束。
  • 使用 PRAGMA foreign_keys = ON; 以确保外键约束生效。

更多详细内容请关注其他相关文章。

发表回复 0

Your email address will not be published. Required fields are marked *