当前位置: 首页 > news >正文

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只能用列级

复合约束(多列)必须用表级

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

http://www.dtcms.com/a/544870.html

相关文章:

  • Rust性能优化:内存对齐与缓存友好实战
  • 现在做网站用什么工具seo推广优化方案
  • “我的电脑”图标没了怎么办 4种方法找回
  • 【架构】-- OpenFeign:声明式 HTTP 客户端框架深度解析
  • 召开网站建设培训会seo推广排名平台有哪些
  • 个人可以做公益网站吗百度会员
  • 基于STM32F4系列MCU和CS5530 24位SDADC的称重传感器系统实现
  • 一文深入学习Java动态代理-JDK动态代理和CGLIB
  • 嵌入式开发学习日志42——stm32之SPI工作方式
  • 网站是什么时候出现的淄博市建设局网站首页
  • MATLAB高效算法实战:30倍提速秘籍
  • 开发个网站开票名称是什么开源做网站需要申请账号吗
  • 从PLY到3DTiles:GISBox助力三维数据格式转换全流程
  • 在 PowerPoint 中自动化创建图表:使用 Spire.Presentation for Java 轻松实现数据可视化
  • day02(10.29)——leetcode面试经典150
  • 实战:用Matplotlib将爬取的CSV数据变成直观图表
  • python数据分析项目之:房地产数据可视化分析
  • 银川微信网站开发一块地需要多少钱
  • Unity编辑器扩展入门篇 - Unity Assets菜单
  • html中音乐网站怎么做自助建站系统建的网站做排名吗
  • 【Linux命令】对ps -ef命令的输出的解读
  • 第二届大数据、神经网络与深度学习研讨会(BDNNDL 2025)
  • 2025年免费aippt排行
  • 【大模型】理论基础(1):函数与神经网络
  • 认识主板总结与硬件工程师岗位笔试面试题集
  • Spring Boot Actuator 监控机制解析
  • 建设网站协议范本哈尔滨制作网页公司
  • 文章修改网站旅游管理论文题目选题
  • Rabbitmq扇形队列取消绑定交换机之后任然接收消息问题
  • 网站正在建设中代码哪个软件发视频可以赚钱