⑦【MySQL】什么是约束?如何使用约束条件?主键、自增、外键、非空....

在这里插入图片描述

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~
个人主页:.29.的博客
学习社区:进去逛一逛~

在这里插入图片描述

约束

  • ⑦【MySQL】约束条件
    • 1. 约束的基本使用
    • 2. 外键约束


⑦【MySQL】约束条件


1. 约束的基本使用

约束

  • 什么是约束?

    • 约束是作用于表中字段上的规则,用于限制存储在表中的数据。
  • 约束的作用:

    • 保证数据库中数据的正确性、有效性和完整性。
  • 约束分类:

    • 非空约束 —— 限制该字段的数据不能为null

      • NOT NULL
        
    • 唯一约束 —— 保证该字段的所有数据都是唯一、不重复的

      • UNIQUE
        
    • 主键约束—— 主键是一行数据的唯一标识,要求非空且唯一

      • PRIMARY KEY
        
    • 默认约束—— 保存数据时,未指定该字段的值,则采用默认值

      • DEFAULT
        
    • 检查约束(8.0.16版本之后)—— 保证字段满足某一条件

      • CHECK
        
    • 外键约束—— 用来让两证表的数据之间建立连接,保证数据的一致性和完整性

      • FOREIGN KEY
        
    • ⑦自增约束

      • AUTO_INCREMENT
        
  • -- 案例
    
    /*
    创建表
    ID唯一标识:id、int、主键且自增
    姓名:name、varchar(10)、不为空且唯一
    年龄:age、int、大于0且小于等于120
    状态:status、char(1)、默认值为1
    性别:gender、char(1)、无约束条件
    */
    CREATE TABLE test(
      id INT COMMENT 'id唯一标识' PRIMARY KEY AUTO_INCREMENT,
      NAME VARCHAR(10) COMMENT '姓名' UNIQUE NOT NULL,
      age INT COMMENT '年龄' CHECK(age BETWEEN 1 AND 120),
      STATUS CHAR(1) COMMENT '状态' DEFAULT 1,
      gender CHAR(1) COMMENT '性别'
    );
    
    -- 查看表结构
    DESC test;
    
    
    -- 向表中插入数据,自增字段可以不指定,会按123...n顺序自动填充
    INSERT INTO test(NAME,age,STATUS,gender) VALUES
    ('小一',18,'1','男');
    
    -- 当设置唯一约束的字段name插入不唯一数据时,会报错:
    -- 错误代码: 1062 Duplicate entry '小一' for key 'test.name'
    INSERT INTO test(NAME,age,STATUS,gender) VALUES
    ('小一',22,'1','女');
    
    -- 当设置非空约束的字段name插入null值,会报错:
    -- 错误代码: 1048 Column 'name' cannot be null
    INSERT INTO test(NAME,age,STATUS,gender) VALUES
    (NULL,22,'1','女');
    
    -- 当设置了检查约束的age字段,插入不符合检查条件的数据,会报错:
    -- 错误代码: 3819 Check constraint 'test_chk_1' is violated.
    INSERT INTO test(NAME,age,STATUS,gender) VALUES
    ('小二',-1,'1','女');
    
    -- 当插入数据时,没有为默认约束字段status设置值,会自动设置默认值1
    INSERT INTO test(NAME,age,gender) VALUES
    ('小三',66,'女');
    



2. 外键约束

如何添加外键约束?

  • 方式一(在创建表时指定外键约束)

  • CREATE TABLE 表名(
    	字段名 数据类型,
        ...
        [CONSTRAINT] [外键名称] FOREIGN KEY(外键字段名) REFERENCES 主表(主表字段名)
    );
    
  • 方式二(在修改表时添加外键约束)

  • ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY(外键字段名) REFERENCES 主表(主表字段名); 
    

外键的删除/更新行为

  • NO ACTION:在父表进行更新/删除时,首先检查记录是否存在外键,存在则不允许删除/更新。(与RESTRICT行为一致)

  • RESTRICT:在父表进行更新/删除时,首先检查记录是否存在外键,存在则不允许删除/更新。(与NO ACTION行为一致)

  • CASCADE:在父表进行更新/删除时,首先检查记录是否存在外键,存在则同时对外键关联的子表进行相应的更新/删除

  • SET NULL:在父表进行更新/删除时,首先检查记录是否存在外键,存在则将外键关联的字段值设置为null(前提是外键关联字段可以为null)

  • SET DEFAULT:在父表进行更新/删除时,首先检查记录是否存在外键,存在则将外键关联的字段值设置为一个默认值(Innodb不支持)

  • 添加外键约束时指定更新行为

  • ALTER TABLE 表名 ADD 
    CONSTRAINT 外键名称 
    FOREIGN KEY(外键字段名) REFERENCES 主表(主表字段名)
    ON UPDATE CASCADE ON DELETE CASCADE;
    -- 将更新行为设定为:CASCADE、将删除行为设定为:CASCADE。
    -- 指定何种更新/删除行为以实际为准,这里提供设定为CASCADE(方式二)的参考。
    -- 除了在修改表时添加外键约束并设定更新/删除行为,还可以在新增表时(方式一)添加并设置。
    




在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

出行平台采集机票价格信息

在上述Python代码中,首先引入了所需的模块,然后设置了代理信息和模拟浏览器访问的网页请求头。随后,使用requests库发送代理请求,并将返回的网页内容解析为HTML。接着,从HTML中提取所需的信息,比如机票价格…

CCF ChinaSoft 2023 论坛巡礼 | 程序语义深度理解前沿进展论坛

2023年CCF中国软件大会(CCF ChinaSoft 2023)由CCF主办,CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办,将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

YOLOv8-Seg改进:小目标涨点系列篇 | TPC-YOLO-seg不同场景小目标分割均能提升 | 23年顶刊最新成果

🚀🚀🚀本文改进:轻量级的基于注意力的网络 TPC-YOLO-seg用于微小物体分割 🚀🚀🚀TPC-YOLO-seg 小目标分割首选,暴力涨点 🚀🚀🚀YOLOv8-seg创新专栏:http://t.csdnimg.cn/KLSdv 学姐带你学习YOLOv8,从入门到创新,轻轻松松搞定科研; 1)手把手教你如何…

Network(二)VLAN技术与网络层解析

一 VLAN 技术与应用 1 广播域 广播域指接收同样广播消息的范围,在该范围中的任何一个设备发送广播,所有其他设备都可以收到。默认情况下交换机的所有接口属于同一个广播域 2 VLAN概述 VLAN,Virtual LAN (虚拟局域网) 交换机的所有接口…

WebSocket Day04 : 消息推送

前言 随着Web应用程序的不断发展,实时性和交互性成为了用户体验中至关重要的一部分。传统的HTTP协议在处理实时数据传输方面存在一些局限性,而WebSocket作为一种全双工通信协议,为实现实时、高效的消息推送提供了全新的解决方案。 在Web开发…

图论15-有向图-环检测+度数+欧拉回路

文章目录 1. 有向图设计1.1 私有变量标记是否有向1.2 添加边的处理,双向变单向1.3 删除边的处理,双向变单向1.4 有向图的出度和入度 2 有向图的环检测2.1 普通的算法实现换检测2.2 拓扑排序中的环检测 3 欧拉回路 1. 有向图设计 1.1 私有变量标记是否有…

6.jvm中对象创建流程与内存分配

目录 概述对象的创建流程对象的内存分配方式对象怎样才会进入老年代大对象直接进入老年代内存担保 jvc 相关指令查看jdk默认使用的gc查看当前jdk支持的有哪些gc查看指定进程当前正在使用的gc 结束 概述 相关文章在此总结如下: 文章地址jvm基本知识地址jvm类加载系…

⑥ 【MySQL函数】字符串函数、数值函数、日期函数、流程函数

个人简介:Java领域新星创作者;阿里云技术博主、星级博主、专家博主;正在Java学习的路上摸爬滚打,记录学习的过程~ 个人主页:.29.的博客 学习社区:进去逛一逛~ MySQL函数 ⑥ 字符串函数、数值函数、日期函数…

YOLOv8-Seg改进:SPPF系列改进篇 | 大核分离卷积注意力模块( Large Separable Kernel Attention)

🚀🚀🚀本文改进:大核分离卷积注意力模块( Large Separable Kernel Attention),实现涨点的目标并且降低计算复杂度和显存,引入到YOLOv8,与SPPF结合实现二次创新; 🚀🚀🚀Large Separable Kernel Attention 亲测在多个数据集能够实现涨点,同样适用于小目标分…

巅峰之作TFN AMT系列手持式信号综合测试仪

手持式信号综合测试仪是对无线电信号进行测量的必备手段,是从事电子产品研发、生产、检验的常用工具。因此,应用十分广泛,被称为工程师的射频万用表。传统的频谱分析仪的前端电路是一定带宽内可调谐的接收机,输入信号经变频器变频…

Jenkins Docker Swarm插件 配置的坑

配置 Docker Host URI 注意,这里要用 http://!!!如果按照提示里用了 tcp:// 则会报错,异常信息如下: 2023-11-13 16:28:42.6830000 [id34] WARNING o.e.j.s.h.ContextHandler$Context#log: Error while s…

探索高效智能:AI 模型的优化工具盘点 | 开源专题 No.43

openai/evals Stars: 12.3k License: NOASSERTION OpenAI Evals 是一个用于评估 LLMs (大型语言模型) 或使用 LLMs 作为组件构建的系统的框架。它还包括一个具有挑战性 evals 的开源注册表。Evals 现在支持通过 Completion Function Protocol 评估任何系统,包括 p…

Ubuntu之apt更换国内镜像源

一、需求说明 Ubuntu系统默认使用的是Ubuntu官网镜像源http://archive.ubuntu.com,网站位于境外,我们使用apt安装软件包的时候经常出现无法连接的情况,如下图所示。所以建议将系统apt安装的镜像源切换为国内镜像源。 二、更新apt镜像源步骤…

Linux常用命令——bzip2命令

在线Linux命令查询工具 bzip2 将文件压缩成bz2格式 补充说明 bzip2命令用于创建和管理(包括解压缩)“.bz2”格式的压缩包。我们遇见Linux压缩打包方法有很多种,以下讲解了Linux压缩打包方法中的Linux bzip2命令的多种范例供大家查看&…

P37[11-2]W25Q64介绍

W25Q64内部是FLASH芯片,可存储8M字节数据,掉电不丢失。 4根SPI通信线,通过STM32操作引脚电平,实现SPI通信时序,实现读取存储器芯片的目的 易失性存储器:SRAM,DRAM等(数据掉电丢失) 非易失性存储器:E2PROM,Flash等(数据掉电不丢失) 字库存储(应用在显示屏上,存储点阵…

浅谈消防设备电源监控系统在大型建筑内的应用

【摘要】:当建筑内火灾发生时,各类消防设备能否正常运行、能否发挥作用是初期火灾扑救是否成功的重要条件之一,而稳定可靠的消防设备电源则是消防设备正常工作的保障。因此针对消防设备电源的监测系统至关重要。 【关键词】:消防…

代码随想录算法训练营第五十三天丨 动态规划part14

1143.最长公共子序列 思路 本题和动态规划:718. 最长重复子数组 (opens new window)区别在于这里不要求是连续的了,但要有相对顺序,即:"ace" 是 "abcde" 的子序列,但 "aec" 不是 &quo…

https:/myproject.git did not send all necessary objects

事情是由于在git push 的时候,电脑突然蓝屏了,再打开电脑的时候,git pull git push都失效了, 粗暴的解决方式是重新在拉取代码,可以暂时解决,但是考虑到可能以后还会遇到这个问题,所以在不紧急…

代码随想录 Day44 动规12 LeetCode T300 最长递增子序列 T674 最长连续递增序列 T718 最长重复子数组

前言 本期我们来解决动规的经典题型------ 子数组问题 我们还是会使用动规五部曲来解决问题,下面我们仍然列出动规五部曲 1.明确dp数组含义 2.明确dp数组如何推导-递推公式 3.初始化dp数组 4.确定遍历顺序 5.打印dp数组排错 LeetCode T300 最长递增子序列 题目链接:300. 最长…

从C语言到C++_40(多线程相关)C++线程接口+线程安全问题加锁(shared_ptr+STL+单例)

目录 1. C多线程 1.1 thread库 1.2 mutex库 1.3 RAII锁 1.4 atomicCAS 1.5 condition_variable 1.6 分别打印奇数和偶数 2. shared_ptr线程安全 2.1 库里面的shared_ptr使用 2.2 shared_ptr加锁代码 3. 单例模式线程安全 3.1 懒汉模式线程安全问题 3.2 懒汉模式最…