SQL-约束

在 SQL 中,约束(Constraint)是用于限制表中数据的规则,目的是保证数据的完整性、一致性和有效性。常见的约束类型包括:主键约束、外键约束、非空约束、唯一约束、检查约束、默认值约束等。下面结合你提供的代码,详细讲解这些约束及其应用。

一、SQL 中常见的约束类型

  1. 主键约束(PRIMARY KEY)

    • 作用:唯一标识表中的每条记录,确保记录的唯一性。
    • 特点:一个表只能有一个主键;主键列的值不能重复(唯一),且不能为NULL;通常与auto_increment(自增)配合使用,自动生成唯一值。
  2. 非空约束(NOT NULL)

    • 作用:限制列的值不能为NULL,必须提供具体数据。
    • 特点:如果插入数据时未指定该列的值,会报错。
  3. 唯一约束(UNIQUE)

    • 作用:确保列中的所有值都是唯一的(不重复)。
    • 特点:与主键的区别是,一个表可以有多个唯一约束;唯一约束允许列值为NULL(且可以有多个NULL,因为NULL不等于任何值)。
  4. 检查约束(CHECK)

    • 作用:限制列的值必须满足指定的条件(如范围、格式等)。
    • 特点:确保数据符合业务规则,例如年龄必须在 0-120 之间。
  5. 默认值约束(DEFAULT)

    • 作用:当插入数据时未指定该列的值,自动使用默认值。
  6. 外键约束(FOREIGN KEY)

    • 作用:建立两个表之间的关联关系(父子表),确保子表中引用的外键值在主表的主键中存在(或为NULL),维护数据的参照完整性。
    • 相关概念:
      • 主表(父表):被引用的表(如dept表)。
      • 子表(从表):引用主表的表(如emp表)。
      • 外键列:子表中用于关联主表主键的列(如emp.dept_id关联dept.id)。
    • 级联操作(通过ON UPDATEON DELETE指定):
      • CASCADE:当主表的主键更新 / 删除时,子表的外键值同步更新 / 删除。
      • SET NULL:当主表的主键更新 / 删除时,子表的外键值设为NULL(需确保外键列允许NULL)。

二、代码详解

以下是对提供的 SQL 代码的逐段解释:

1. 创建user
create table user(id int primary key auto_increment comment '主键',  -- 主键约束+自增name varchar(10) not null unique comment '姓名',   -- 非空约束+唯一约束age int check (age >= 0 and age <= 120) comment '年龄',  -- 检查约束status char(1) default '1' comment '状态',  -- 默认值约束gender char(1) comment '性别'  -- 无特殊约束
)comment '用户表';
  • id:主键(primary key),确保每条用户记录唯一;auto_increment表示插入时无需手动指定,自动递增生成。
  • namenot null(必须提供姓名)+ unique(姓名不能重复)。
  • agecheck约束限制年龄必须在 0-120 之间(若插入年龄为 150,会报错)。
  • statusdefault '1'表示若插入时未指定status,默认值为 '1'(可理解为 “正常” 状态)。
2. 插入数据到user
-- 插入3条完整数据
insert into user(name, age, status, gender) values 
('Tom1', 19, '0', '男'),
('Tom2', 25, '1', '女'),
('Tom3', 17, '0', '男');-- 插入时未指定status,会使用默认值'1'
insert into user(name, age, gender) values ('Tom5', 32,'男');
  • 第一条插入语句显式指定了所有列的值,status分别为 '0'、'1'、'0'。
  • 第二条插入语句未指定status,因此status会自动使用默认值 '1'。
3. 创建dept表(部门表)
create table dept(id int primary key auto_increment comment 'ID' ,  -- 主键+自增name varchar(50) not null comment '部门名称'  -- 非空约束
)comment '部门表';-- 插入部门数据
insert into dept values (1, '研发部'),(2,'市场部'),(3, '财务部'),(4, '销售部'),(5, '总经办');
  • id:部门唯一标识(主键 + 自增)。
  • namenot null确保部门名称必须填写(不能为NULL)。
4. 创建emp表(员工表)及外键操作
-- 创建员工表
create table emp(id int primary key auto_increment comment 'ID' ,  -- 主键+自增name varchar(50) not null comment '姓名',  -- 非空约束age int comment '年龄',job varchar(20) comment '职位',salary int comment '薪资',entrydate date comment '入职时间',managerid int comment '直属领导ID',  -- 可关联其他员工(自关联)dept_id int comment '部门ID'  -- 外键,关联dept表的id
)comment '员工表';-- 插入员工数据
insert into emp values 
(1, '金庸', 66, '总裁', 20000, '2000-01-01', null, 5),  -- 总裁无领导(managerid为null),属于总经办(dept_id=5)
(2, '张无忌', 20, '项目经理', 12500, '2005-12-01', 1, 1),  -- 领导是金庸(id=1),属于研发部(dept_id=1)
...  -- 其他员工数据
  • emp表的dept_id用于关联dept表的id(表示员工所属部门),后续通过外键约束正式建立关联。
5. 外键约束的添加、删除与修改
-- 第一次添加外键约束:关联emp.dept_id到dept.id(无特殊级联操作)
alter table emp add constraint fk_emp_dept_id 
foreign key (dept_id) references dept(id);-- 删除外键约束
alter table emp drop foreign key fk_emp_dept_id;-- 第二次添加外键:级联更新和删除(主表操作影响子表)
alter table emp add constraint fk_emp_dept_id 
foreign key (dept_id) references dept(id) 
on UPDATE cascade  -- 当dept.id更新时,emp.dept_id同步更新
on DELETE cascade;  -- 当dept的记录删除时,emp中对应记录也删除-- 第三次修改外键:主表操作时子表外键设为NULL
alter table emp add constraint fk_emp_dept_id 
foreign key (dept_id) references dept(id) 
on update set null  -- 当dept.id更新时,emp.dept_id设为NULL
on delete set null;  -- 当dept的记录删除时,emp.dept_id设为NULL
  • 外键约束名称fk_emp_dept_id是自定义的(通常格式为fk_子表_外键列)。
  • 第一次添加的外键无ON UPDATE/DELETE,表示若主表deptid被更新或记录被删除,而子表emp中仍有引用,会直接报错(阻止操作)。
  • ON UPDATE CASCADE ON DELETE CASCADE:例如,若dept表中id=1(研发部)被更新为10,则emp表中所有dept_id=1的记录会自动变为10;若研发部记录被删除,所有属于研发部的员工记录也会被删除。
  • ON UPDATE SET NULL ON DELETE SET NULL:例如,若研发部(id=1)被删除,emp表中所有dept_id=1的员工,其dept_id会被设为NULL(表示 “无部门”)。

三、总结

约束是 SQL 中保证数据质量的核心机制:

  • 主键、唯一约束确保数据唯一性;
  • 非空、检查约束确保数据有效性;
  • 默认值约束简化数据插入;
  • 外键约束维护表之间的关联完整性,通过级联操作灵活处理主表变更对从表的影响。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/98286.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/98286.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

kafka如何保证消息不被重复消费

首先kafka事务没办法做到这一点&#xff0c;事务只能保证以下几点&#xff1a;producer发送多条消息&#xff0c;要么同时成功&#xff0c;要么同时失败&#xff1b;在没有提交事务之前&#xff0c;消息对消费者不可见&#xff0c;事务失败需要程序员自己调用kafka的 abort 回滚…

[性能分析与优化]伪共享问题(perf + cpp)

伪共享问题的主要来源有两件事每次cache读入一个数据时实际上读入整个数据行多个线程可能会读入相同的数据行由于cache写回内存时也是按照数据行进行写入的&#xff0c;导致了写回内存时并不能做到真正的共享&#xff0c;而是需要等待。解决方案有两种将需要并行计算的数据使用…

【Uni-App+SSM 宠物项目实战】Day14:商家服务列表

一、前言 欢迎回到mypet项目实战!📋 今天我们实现商家服务管理核心功能——商家服务列表展示与上拉加载更多。商家成功注册并通过审核后,可发布宠物服务项目(如洗澡、美容、医疗等),用户通过服务列表浏览并预约。 本次实现的核心是**“分页加载”**技术:后端使用MyBa…

DNS服务管理

一、概述 概念 Domain Name Service&#xff0c;一套分布式的域名服务系统&#xff0c;即有多个DNS服务器遍布于世界。每个DNS服务器上存放着大量的机器域名和IP地址的映射&#xff0c;并且是动态更新。众多网络客户端程序都使用DNS协议来向DNS服务器查询目标主机的IP地址。 …

自定义类型:结构体、联合与枚举(2)

目录 前言 一、 联合体类型的声明 介绍&#xff1a; 注意&#xff1a; 二、 联合体的特点 介绍&#xff1a; 代码举例&#xff1a; 三、联合体⼤⼩的计算 介绍&#xff1a; 联合体大小的计算规则 1. 基础规则 1. 确定最大成员大小 2. 计算对齐模数的最小公倍数 3…

Oceanbase下使用TPC-H模式生成数据

1.下载tpc-h http://www.tpc.org/ 点击下载始终弹出这个画面&#xff0c;尝试了多种方法无效&#xff0c;最后选择科学上网工具&#xff0c;才正常下载。 通过网盘分享的文件&#xff1a;TPC-H-Toolv3.zip 链接: https://pan.baidu.com/s/14CXrp7v_7XkPtXfFLkziBQ?pwdqf5t 提…

LeetCode 面试经典 150_哈希表_单词规律(41_290_C++_简单)

LeetCode 面试经典 150_哈希表_单词规律&#xff08;41_290_C_简单&#xff09;题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;哈希表&#xff09;&#xff1a;代码实现代码实现&#xff08;思路一&#xff08;哈希表&a…

librespeed c++ 上传下载带宽测试 排坑全流程

在搭建 LibreSpeed 测速服务并实现基于 curl/API 的上传下载测试时&#xff0c;遇到 Nginx 配置冲突、PHP 权限异常等问题。本文将梳理从环境搭建到功能验证的全流程&#xff0c;针对 “curl 上传报 404/405”“PHP-FPM 权限拒绝”等典型问题&#xff0c;提供可复现的解决方案。…

重读生成概率模型1----基础概念

1 KL 散度 KL 散度的作为是描述两个分布的差异的&#xff0c;首先是度量一个分布&#xff0c;用熵来度量。 1.1 熵 在介绍熵之间&#xff0c;首先要度量单个事件的信息量 I(x)−logP(x)I(x)-logP(x)I(x)−logP(x) 整体的信息量 H(P)Ex P[−logP(x)]−∑P(x)logP(x) \begin{alig…

排查解决磁盘占用高问题(容器挂载的磁盘)

最近遇到磁盘占用高的告警&#xff0c;记录一下解决的思路。 首先是系统触发告警&#xff0c;通知我们某台机器磁盘占用高。&#xff08;或其他途径得知&#xff09; 通过XShell登录该机器。 执行df-h命令查看挂载占用情况找到真正占用高的挂载点挂载点/home目录占用高&#xf…

流体(1)

流体 Minecraft 中的流体(Fluid),也常被称为液体(Liquid),是一类能够自由流动、形成河流、瀑布或湖泊的特殊方块。它们的行为基于简化的流体力学,是游戏世界中动态环境的重要组成部分。 💧 流体是什么? 在 Minecraft 中,流体核心特点包括: 源方块与流动:每个流…

机器学习-卷积神经网络(CNN)

全连接层->卷积层 用有一个隐藏层的MLP训练ImageNet数据集&#xff08;300*300的图像&#xff0c;有1000个类别&#xff09;&#xff0c;要有10000个输出 会有10亿个可学习的参数&#xff0c;量太大 全连接&#xff1a;一个输出是根据所有输入加权得到在图片中识别物体&…

Ubuntu 磁盘扩容与扩容失败问题解决( df -h 与 GParted 显示空间不一致的问题 -LVM)

在管理 Linux 磁盘时&#xff0c;你是否遇到过这样的困惑&#xff1a;正常扩容之后&#xff0c;发现GParted 显示某个分区还有几十 GiB 可用&#xff0c;但 df -h 却提示该分区已接近满额&#xff1f;这种 “空间幻觉” 背后是系统存储管理的分层设计&#xff0c;本文将从原理到…

PyQt5中QLineEdit控件数值显示与小数位数控制

在PyQt5应用程序开发中&#xff0c;QLineEdit控件常用于显示和编辑文本内容。当需要用它来显示数值并控制小数位数时&#xff0c;开发者需要掌握一些特定的技巧。本文将深入探讨几种实现方法&#xff0c;每种方法都附带完整独立的代码示例。 数值格式化基础 在Python中&#xf…

LangChain使用方法以OpenAI 的聊天模型GPT-4o为例

以使用 OpenAI 的聊天模型&#xff08;如 GPT-4&#xff09;为例&#xff0c;从设置环境、初始化模型、调用模型到处理响应的各个方面进行介绍&#xff1a; 1. 环境设置 安装 langchain-openai 包。设置环境变量 OPENAI_API_KEY&#xff0c;用于认证&#xff08;以linux为例&am…

Oracle为数据大表创建索引方案

在日常业务中&#xff0c;避免不了为数据量大表补充创建索引的情况&#xff0c;如果快速、有效地创建索引成了一个至关重要的问题&#xff08;注意&#xff1a;虽然提供有ONLINE在线执行的方式&#xff0c;理想状态下不会阻塞DML操作&#xff0c;但ONLINE在开始、结束的两个时刻…

网站服务相关问题

目录 HTTP常见的状态码 http和https的区别以及使用的端口号 http处理请求的过程 https认证过程 正向代理和反向代理的区别 HTTP常见的状态码 HTTP&#xff08;超文本传输协议&#xff09;定义了一系列的状态码&#xff0c;用于表示客户端请求的处理结果。以下是一些常见的…

Go并发编程实战:深入理解Goroutine与Channel

Go并发编程实战&#xff1a;深入理解Goroutine与ChannelGo并发编程实战&#xff1a;深入理解Goroutine与Channel概述1. 为什么是Go的并发&#xff1f;从“线程”与“协程”说起2. Goroutine&#xff1a;如何使用&#xff1f;3. Channel&#xff1a;Goroutine间的安全通信创建与…

2025服贸会“海淀之夜”,点亮“科技”与“服务”底色

2025年9月12日傍晚&#xff0c;北京颐和园&#xff0c;十七孔桥旁&#xff0c;2025年中国国际服务贸易交易会“海淀之夜”如约而至。在“海淀之夜”&#xff0c;科技机构、金融机构、咨询服务机构、出海服务企业以及跨国企业和国际友人等&#xff0c;将目光聚焦于此。被第三方机…

qt使用camke时,采用vcpkg工具链设置VTK的qt模块QVTKOpenGLNativeWidget

下载:QVTKOpenGLNativeWidget嵌入qt应用中资源-CSDN下载 1.通过vcpkg安装VTK,目前的VTK里面默认为qt6,如果需要安装qt5,需要将端口配置进行修改 笔者的vcpkg的vtk端口路径:D:\vcpkg\ports\vtk portfile.cmake 修改点: #第一处 #file(READ "${CURRENT_INSTALLED_DIR}/sh…