SQLite3 中列(变量)的特殊属性

在 SQLite3 中,列的特殊属性通常通过约束(Constraints)和数据类型修饰符来定义。这些属性可以在创建表时指定,用于限制数据的完整性或定义特殊行为。以下是 SQLite3 支持的主要特殊属性及其说明:

1. 主键约束(PRIMARY KEY)

  • 功能:确保列中的值唯一且不为 NULL,通常用于标识表中的每一行。

  • 示例

    sql 复制代码
    CREATE TABLE users (
        id INTEGER PRIMARY KEY,  -- 自增主键(见 AUTOINCREMENT)
        name TEXT NOT NULL
    );
  • 特性

    • 若未显式指定值,SQLite 会自动分配一个唯一的整数(ROWID)。
    • 一个表只能有一个主键,但主键可以由多个列组成(复合主键)。

2. 自增属性(AUTOINCREMENT)

  • 功能 :仅用于 INTEGER PRIMARY KEY,确保值严格递增且不会被重用(即使行被删除)。

  • 示例

    sql 复制代码
    CREATE TABLE logs (
        id INTEGER PRIMARY KEY AUTOINCREMENT,  -- 自增且不重用值
        message TEXT
    );
  • 注意

    • 不使用 AUTOINCREMENT 时,SQLite 可能会重用已删除的 ID 值(性能更佳)。
    • AUTOINCREMENT 会增加额外开销,仅在需要严格递增时使用。

3. 唯一约束(UNIQUE)

  • 功能:确保列中的所有值都是唯一的,但允许有一个 NULL 值。

  • 示例

    sql 复制代码
    CREATE TABLE emails (
        user_id INTEGER PRIMARY KEY,
        email TEXT UNIQUE  -- 每个邮箱必须唯一
    );

4. 非空约束(NOT NULL)

  • 功能:禁止列中插入 NULL 值。

  • 示例

    sql 复制代码
    CREATE TABLE products (
        id INTEGER PRIMARY KEY,
        name TEXT NOT NULL,  -- 名称不能为空
        price REAL
    );

5. 默认值(DEFAULT)

  • 功能:当插入时未提供值,则使用预设的默认值。

  • 示例

    sql 复制代码
    CREATE TABLE tasks (
        id INTEGER PRIMARY KEY,
        status TEXT DEFAULT 'pending',  -- 默认状态为 "pending"
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP  -- 默认时间为当前时间
    );

6. CHECK 约束

  • 功能:自定义条件,确保插入或更新的值满足特定表达式。

  • 示例

    sql 复制代码
    CREATE TABLE employees (
        id INTEGER PRIMARY KEY,
        salary REAL CHECK (salary > 0),  -- 工资必须为正数
        age INTEGER CHECK (age >= 18)    -- 年龄必须 >= 18
    );

7. 外键约束(FOREIGN KEY)

  • 功能:建立表间关联,确保引用的值存在于关联表中。

  • 示例

    sql 复制代码
    CREATE TABLE orders (
        order_id INTEGER PRIMARY KEY,
        user_id INTEGER,
        FOREIGN KEY (user_id) REFERENCES users(id)  -- user_id 必须存在于 users 表的 id 列中
    );
  • 特性

    • 需要通过 PRAGMA foreign_keys = ON; 启用外键约束。
    • 可配合 ON DELETEON UPDATE 子句定义级联操作(如 CASCADESET NULL)。

8. 索引(INDEX)

  • 功能:加速查询,但不属于严格的约束。

  • 示例

    sql 复制代码
    CREATE INDEX idx_emails ON emails(email);  -- 为 email 列创建索引

9. 冲突处理

  • 功能 :当违反约束时的默认行为,可通过 ON CONFLICT 子句指定。

  • 选项

    • ROLLBACK:回滚事务。
    • ABORT:中止当前操作(默认)。
    • REPLACE:替换已有记录。
    • IGNORE:忽略冲突。
  • 示例

    sql 复制代码
    INSERT OR REPLACE INTO emails (user_id, email) VALUES (1, 'new@example.com');

10. 自动时间戳

  • 功能 :利用 DEFAULT CURRENT_TIMESTAMP 自动记录时间。

  • 示例

    sql 复制代码
    CREATE TABLE sessions (
        id INTEGER PRIMARY KEY,
        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
        updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP  -- 更新时自动刷新
    );

总结

属性 作用
PRIMARY KEY 确保唯一性和非空性,通常作为行标识符。
AUTOINCREMENT 强制整数主键严格递增且不重用值。
UNIQUE 确保列值唯一(允许一个 NULL)。
NOT NULL 禁止插入 NULL 值。
DEFAULT value 未提供值时使用默认值。
CHECK (expr) 自定义约束条件。
FOREIGN KEY 建立表间引用关系。
INDEX 加速查询(非约束)。
ON CONFLICT 定义约束冲突时的处理策略。

使用建议

  • 主键选择 :优先使用 INTEGER PRIMARY KEY,性能最佳。仅在必要时添加 AUTOINCREMENT
  • 外键约束 :启用外键约束(PRAGMA foreign_keys = ON)以维护数据完整性。
  • CHECK 约束:用于业务规则(如年龄范围、金额限制),但避免复杂表达式以保持性能。
相关推荐
plainGeekDev41 分钟前
单例模式 → object 声明
android·java·kotlin
用户298698530141 小时前
Java 实现 Word 文档文本与图片提取的方法
java·后端
SimonKing2 小时前
铁子,IntelliJ IDEA 2026.1.3来了,升不升?
java·后端·程序员
兵慌码乱12 小时前
面向桌面端的资产管理系统分层架构设计与核心模块实现
python·系统架构·sqlite·pyqt5·数据库设计·桌面应用开发·mvc架构
咖啡八杯13 小时前
GoF设计模式——策略模式
java·后端·spring·设计模式
用户1285261160221 小时前
我把祖传Java项目重构后,接口响应从3s砍到了200ms,只改了这几行代码
java
Linsk21 小时前
组件 = 模板 + 业务逻辑
java·前端·vue.js
星沉远浦1 天前
用Gemini高效解决Java代码报错难以定位的问题
java
用户298698530141 天前
Word 文档字符级格式化:Java 实现方案详解
java·后端