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
);
  • 特点:每个约束都跟在具体列后面,只限制这一列的数据(比如phoneNOT 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_idorder_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只能用列级 复合约束(多列)必须用表级

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

相关推荐
x***J34814 分钟前
SQL视图使用
数据库·sql
cipher25 分钟前
删库之夜·Ω诡计
数据库·程序员
好记忆不如烂笔头abc29 分钟前
DBMS_RESOURCE_MANAGER.CALIBRATE_IO测试oracle的iops和延迟
数据库·oracle
HitpointNetSuite33 分钟前
生物医药企业ERP系统比较:为什么选择Oracle NetSuite?
数据库·oracle·netsuite·erp·hitpointcloud
好记忆不如烂笔头abc39 分钟前
Oracle ORION模拟Database负载测试存储性能
数据库·oracle
xdpcxq10291 小时前
使用.NET 8+ 与飞书API构建同步服务
数据库·.net·飞书
c***72741 小时前
SpringBoot集成Flink-CDC,实现对数据库数据的监听
数据库·spring boot·flink
likuolei1 小时前
Git 工作区、暂存区和版本库
数据库·git
此生只爱蛋1 小时前
【Redis】服务端高并发分布式结构演进之路
数据库·redis·分布式
纪莫1 小时前
技术面:MySQL(一条SQL在MySQL的执行过程?、MyISAM和InnoDB的区别?数据库事务机制?)
java·数据库·java面试⑧股