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 约束:用于业务规则(如年龄范围、金额限制),但避免复杂表达式以保持性能。
相关推荐
马剑威(威哥爱编程)3 分钟前
鸿蒙6开发视频播放器的屏幕方向适配问题
java·音视频·harmonyos
JIngJaneIL7 分钟前
社区互助|社区交易|基于springboot+vue的社区互助交易系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·论文·毕设·社区互助
V***u45336 分钟前
MS SQL Server partition by 函数实战二 编排考场人员
java·服务器·开发语言
这是程序猿1 小时前
基于java的ssm框架旅游在线平台
java·开发语言·spring boot·spring·旅游·旅游在线平台
i***t9191 小时前
基于SpringBoot和PostGIS的云南与缅甸的千里边境线实战
java·spring boot·spring
k***08291 小时前
【监控】spring actuator源码速读
java·spring boot·spring
麦麦鸡腿堡1 小时前
Java_网络编程_InetAddress类与Socket类
java·服务器·网络
vx_dmxq2112 小时前
【PHP考研互助系统】(免费领源码+演示录像)|可做计算机毕设Java、Python、PHP、小程序APP、C#、爬虫大数据、单片机、文案
java·spring boot·mysql·考研·微信小程序·小程序·php
5***g2982 小时前
新手如何快速搭建一个Springboot项目
java·spring boot·后端
daidaidaiyu2 小时前
Jetlinks 物联网平台 开源版学习源码分析
java·mqtt·rxjava·tcp