SQlite:列级,表级约束

目录

先明确:什么是"列级"和"表级"?

场景1:列级约束------管好单个字段的规则

场景2:表级约束------管好多个列的组合规则

最典型的表级约束:复合主键

总结:什么时候用列级/表级?


用"电商订单系统"的场景来理解"列级约束"和"表级约束"的区别,你会发现它们本质是"约束作用范围"的不同------有的约束只管单个列,有的约束需要管多个列。

先明确:什么是"列级"和"表级"?

简单说:

  • 列级约束:绑在某一个列上,只对这一列生效(比如"手机号不能为空");

  • 表级约束:不绑在单个列上,对表中多个列的组合生效(比如"同一用户不能在同一时间下两单")。

场景1:列级约束------管好单个字段的规则

假设你要设计一张user(用户表),需要保证:

  • 用户ID(user_id)唯一且非空(主键);

  • 手机号(phone)不能为空,且不能重复(避免一个手机号注册多个账号);

  • 年龄(age)必须大于0(不能是负数或0)。

这些规则都只针对单个列,适合用列级约束(在列定义时直接加规则):

复制代码
CREATE TABLE user (
    user_id INTEGER PRIMARY KEY, -- 列级:主键(唯一+非空)
    phone TEXT NOT NULL UNIQUE,  -- 列级:非空+唯一(单个列的规则)
    age INTEGER CHECK(age > 0),  -- 列级:年龄必须>0(单个列的范围)
    name TEXT
);
  • 特点:每个约束都跟在具体列后面,只限制这一列的数据(比如phone的NOT NULL不会影响name列)。

  • 注意:NOT NULL只能用列级约束(因为它本质就是限制"某一列不能空",不可能涉及多列)。

场景2:表级约束------管好多个列的组合规则

再设计一张order(订单表),需要保证:

  • 订单由"用户ID(user_id)+ 下单时间(order_time)"共同标识(同一用户同一时间不能下两单);

  • 订单的"支付金额(pay_amount)"必须大于"商品金额(goods_amount)"(避免支付金额小于商品金额的错误)。

这些规则涉及多个列,必须用表级约束(在所有列定义完后,单独写规则):

复制代码
CREATE TABLE "order" (
    order_id INTEGER,
    user_id INTEGER,
    order_time TEXT,
    goods_amount REAL, -- 商品金额
    pay_amount REAL,   -- 支付金额

    -- 表级约束:多个列的组合规则
    PRIMARY KEY (order_id), -- 单列主键也可以放表级(但习惯放列级)
    UNIQUE (user_id, order_time), -- 表级:user_id+order_time组合唯一
    CHECK (pay_amount >= goods_amount) -- 表级:两列数值比较
);
  • 为什么用表级?

    • UNIQUE (user_id, order_time):限制的是"两列组合"不能重复(单个user_id或order_time可以重复),列级约束做不到(列级只能限制单个列唯一);

    • CHECK (pay_amount >= goods_amount):需要比较两个列的值,列级约束只能检查当前列(比如pay_amount单独CHECK(pay_amount>0)),不能跨列比较。

最典型的表级约束:复合主键

比如"用户-课程选课表"(student_course),需要"学生ID+课程ID"组合唯一(一个学生不能重复选同一门课)。这是必须用表级约束的场景:

复制代码
CREATE TABLE student_course (
    student_id INTEGER,
    course_id INTEGER,
    score INTEGER,

    -- 表级:复合主键(只能表级定义)
    PRIMARY KEY (student_id, course_id)
);
  • 为什么不能用列级?

    列级主键只能绑一个列(比如student_id INTEGER PRIMARY KEY),但这里需要两个列组合起来当主键,所以必须在表级定义。

总结:什么时候用列级/表级?

约束类型 列级约束(单个列) 表级约束(多个列)
适用场景 只限制某一列的规则(如非空、单列唯一、单列范围) 限制多列组合的规则(如复合主键、多列唯一、跨列比较)
典型例子 phone TEXT NOT NULL UNIQUE UNIQUE (user_id, order_time)、复合主键
特殊点 NOT NULL只能用列级 复合约束(多列)必须用表级

面试时记住核心区别:列级管单个列,表级管多列组合。遇到"复合主键""多列唯一""跨列检查"的场景,直接说用表级约束,这就是得分点~

相关推荐
Elastic 中国社区官方博客3 小时前
将你自己的密钥用于现有 Elastic Cloud 部署
大数据·数据库·elasticsearch·全文检索
红海云4 小时前
Jev:给智能系统做判断的模型
大数据·数据库·人工智能
wjkjpcba4 小时前
PCBA烧录程序是什么:PCBA包工包料厂家解析烧录与测试
linux·数据库·人工智能·smt贴片加工·pcba贴片加工厂
꯭自꯭闭꯭4 小时前
达梦事物特性及MVCC
linux·运维·数据库
小马同学-5 小时前
MySQL主从复制和读写分离
数据库·mysql
谢亮_vipxieliang5 小时前
Spring 事务失效的常见场景
java·开发语言·数据库·spring boot
geovindu6 小时前
sql: JSON and XML Data Handling in SQL using sql server 2025
大数据·数据库·sqlserver·数据库开发·数据库架构
IT大白鼠6 小时前
图数据库系列 · 第 02 篇——架构拆解:原生图存储到因果集群
数据库·架构·nosql
EatFan7 小时前
从“框架混战“到“运行时收敛“:2026 年 AI Agent 开发框架的三条路线之争
java·数据库·人工智能·多智能体·ai agent·mcp·agent 框架
小蒜学长7 小时前
基于SpringBoot的佳新超市管理系统设计与实现系统(代码+数据库+LW)
java·数据库·spring boot·后端·佳新超市管理系统