MySQL 约束 (constraint)

news2024/9/21 20:25:35

文章目录

  • 约束(constraint)
    • 列级约束和表级约束
    • 给约束起名字(constraint)
    • 非空约束(no null)
    • 检查约束(check)
    • 唯一性约束 (unique)
    • 主键约束 (primary key)
      • 主键分类
      • 单一主键
      • 复合主键
      • 主键自增 (auto_increment)
    • 外键约束
      • 外什么用外键
      • 级联删除
      • 级联更新
      • 级联置空
      • 注意点

约束(constraint)

列级约束和表级约束

列级约束

直接在字段后面是列级约束
create table test (
	id int 约束1 约束2.....,
	name varchar(20) 约束1 约束2....
);

表级约束

定义完,再约束是表记约束。比如联合不能重复的时候就要用到
create table test (
	id int,
	name varchar(20),
	//这里表示 id 和 name联合不能重复 
	unique(id, name)
);


给约束起名字(constraint)

create table test (
	id int,
	name varchar(20),
	//这里给 unique 起别名,方便删除 
	constraint 别名 unique(id, name)
);

约束的描述信息,在information_schema 库中的 table_constraints表中



非空约束(no null)

create table test (
	id int.
	name varchar(255) not nul;
);
//表示 name 字段不能为空


检查约束(check)

create table test (
	id int,
	name varchar(255),
	age int check(age > 18)
);
//表示 age 必须 大于 18


唯一性约束 (unique)

create table test(
  no int,
  name varchar(100),
  email varchar(100), 
  unique(name, email)
);
//把 email 和 name 设置成联合唯一性的,不能插入重复的,除了NULL


主键约束 (primary key)

  • 主键约束的字段不能为NULL,并且不能重复。

  • 任何一张表都应该有主键,没有主键的表可以视为无效表。

  • 主键值是这行记录的唯一标识。在数据库表中即使两条数据一模一样,但由于主键值不同,我们也会认为是两条完全的不同的数据。


主键分类

  1. 根据字段数量分类:
    1. 单一主键(1个字段作为主键)【建议】
    2. 复合主键(2个或2个以上的字段作为主键)
  2. 根据业务分类:
    1. 自然主键(主键和任何业务都无关,只是一个单纯的自然数据)【建议】
    2. 业务主键(主键和业务挂钩,例如:银行卡账号作为主键)

单一主键

create table test (
  uid int primary key,
  nno varchar(100) unique,
  name varchar(100) not null
)
//把 uid 设置为主键

复合主键

create table test (
  uid int,
  nno varchar(100) unique,
  name varchar(100) not null,
  primary key(uid, nno)
)
//把 uid 和 nno 设置成联合主键

不建议使用


主键自增 (auto_increment)

主键自增:既然主键值是一个自然的数字,mysql为主键值提供了一种自增机制,不需要我们程序员维护,mysql自动维护该字段

create table test (
  no int primary key auto_increment,
  name varchar(20)
);



外键约束

create table t_school( 
  sno int primary key, 
  sname varchar(255) 
); 


create table t_student( 
  no int primary key, 
  name varchar(255), 
  age int, 
  sno int, 
  
  //constraint 是起别名,foreign key...references 是外键
  constraint t_school_sno_fk foreign key(sno) references t_school(sno) 
);
//外键不一定是主键,也可以是父表中具有唯一性的字段


外什么用外键

在这里插入图片描述
图片来源:动力节点

这种情况比较浪费空间直接两张表,然后设置外键


表一

在这里插入图片描述
图片来源:动力节点


表二

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
图片来源:动力节点



级联删除

创建子表时,外键可以添加:on delete cascade,这样在删除父表数据时,子表会级联删除。谨慎使用。

create table t_student( 
  no int primary key, 
  name varchar(255), 
  age int, 
  sno int, 
  constraint t_school_sno_fk foreign key(sno) references t_school(sno) on delete cascade 
);
###删除约束
alert table t_student drop foreign key t_student_sno_fk;
###添加约束
alert table t_student add constraint t_student_sno_fk foreign key(sno) references t_school(sno) on delete cascade; 


级联更新

创建子表时,外键可以添加:on update cascade ,这样在修改父表数据时,子表会级联修改,谨慎使用。

create table t_student( 
  no int primary key, 
  name varchar(255), 
  age int, 
  sno int, 
  constraint t_school_sno_fk foreign key(sno) references t_school(sno) on update cascade 
);


级联置空

创建子表时,外键可以添加:on delete set null,父数据设置成 null ,子表会级联设置为 null ,谨慎使用。

create table t_student( 
  no int primary key, 
  name varchar(255), 
  age int, 
  sno int, 
  constraint t_school_sno_fk foreign key(sno) references t_school(sno) on delete set null 
);


注意点

  • 添加了外键约束的字段中的数据必须来自其他字段,不能随便填。

  • 假设给a字段添加了外键约束,要求a字段中的数据必须来自b字段,b字段不一定是主键,但至少要有唯一性。

  • 外键约束可以给单个字段添加,叫做单一外键。也可以给多个字段联合添加,叫做复合外键。复合外键很少用。

a 表 如果引用 b 表 中的数据,可以把 b表 叫做 父表 ,把 a 表 叫做 子表。

  1. 创建表时,先创建父表,再创建子表。
  2. 插入数据时,先插入父表,在插入子表。
  3. 删除数据时,先删除子表,再删除父表。
  4. 删除表时,先删除子表,再删除父表。

插入就先父,删除先子

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

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

相关文章

【IEEE出版 | 广东省高校联合主办】第六届物联网、自动化和人工智能国际学术会议(IoTAAI 2024,7月26-28)

第六届物联网、自动化和人工智能国际会议(IoTAAI 2024)将于2024年07月26-28日在中国广州召开。 会议旨在拓展国际科技学术交流渠道,搭建学术资源共享平台,促进全球范围内的科技创新,提升中外学术合作。会议还鼓励不同领…

BGP选路之Preferred value

原理概述 当一台BGP路由器中存在多条去往同一目标网络的BGP路由时,BGP协议会对这些BGP路由的属性进行比较,以确定去往该目标网络的最优BGP路由,然后将该最优BGP路由与去往同一目标网络的其他协议路由进行比较,从而决定是否将该最优…

FliFlik KleanOut for Photo 的妙用

FliFlik KleanOut for Photo 是一款专业的图像水印去除软件,旨在帮助用户快速高效地去除照片中的水印标识。无论是文本水印还是图像水印,该软件都能有效识别并删除,保持图像原始清晰度和质量。它采用 AI 算法引擎,可以精准识别和删…

MongoDB教程(十六):MongoDB高级索引

💝💝💝首先,欢迎各位来到我的博客,很高兴能够在这里和您见面!希望您在这里不仅可以有所收获,同时也能感受到一份轻松欢乐的氛围,祝你生活愉快! 文章目录 引言一、全文索…

最简单的typora+gitee+picgo配置图床

typoragiteepicgo图床 你是否因为管理图片而感到头大?是时候了解一下 Typora、Gitee 和 PicGo 这个超级三剑客了,它们可以帮你轻松打造自己的图床,让你的博客图片管理变得简单又有趣。让我们开始这场神奇的图床之旅吧! Typora …

大型语言模型的生物医学知识图优化提示生成

大型语言模型的生物医学知识图优化提示生成 https://arxiv.org/abs/2311.17330 https://github.com/BaranziniLab/KG_RAG 大型语言模型的生物医学知识图优化提示生成 摘要 KG-RAG框架,较好的结合了生物医学知识图谱SPOKE和LLM的优势。SPOKE是一个开放知识图谱&…

聚焦保险行业客户经营现状,概述神策数据 CJO 解决方案

触点红利时代,企业的经营需求从「深度的用户行为分析」转变为「个性化、全渠道一致的客户体验」。客户旅程编排(Customer Journey Orchestration,简称 CJO)从体验出发,关注客户需求、感受和满意度,能够帮助…

04 HTML CSS JavaScript

文章目录 HTML1、HTML介绍2、快速入门3、基础标签4、图片、音频、视频标签5、超链接标签6、列表标签7、表格标签8、布局标签9、 表单标签 CSS1、 概述2、 css 导入方式3、 css 选择器4、 css 属性 JavaScript1、JavaScript简介2、JavaScript引入方式3、JavaScript基础语法4、Ja…

Adobe Audition(AU)安装包软件下载

目录 一、下载 二、AU软件介绍 三、使用技巧 四、快捷键操作 常用快捷键: 一、下载 链接https://pan.baidu.com/s/1Ax9pro_Q75YgLYaKDzZg8w?pwd3mi1 二、AU软件介绍 Adobe Audition是一个专业级的音频工作站,适用于音乐制作、广播、播客、视频后…

C#数组复习

一、一维数组 using System.Collections; using System.Collections.Generic; using UnityEngine;public class ShuZu : MonoBehaviour {#region 知识点一 基本概念//数组是存储一组相同类型数据的集合//数组分为 一维、二维、交错数组//一般情况 一维数组 就简称为数组#en…

Onenet模拟Mqtt调试物联网设备

本章节目录 一.调试器模拟设备登录 二.调试器模拟上传数据 三.调试器接受下发控制消息 一.调试器模拟设备登录(让设备处于在线状态) 1.打开文档中心(open.iot.10086.cn) 2,Onenet物联网开放平台 3.产品开发,设备接入->设备开发 4.mqtt协议接入->最佳实践 5.物模型数据交…

样式迁移及代码

一、定义 1、使用卷积神经网络,自动将一个图像中的风格应用在另一图像之上,即风格迁移;两张输入图像:一张是内容图像,另一张是风格图像。 2、训练一些样本使得样本在一些cnn的特征上跟样式图片很相近,在一…

PHP教程002:PHP变量介绍

文章目录 一、PHP程序1、PHP标记2、PHP代码3、语句结束符;4、注释 二、PHP变量2.1 声明变量2.2 赋值运算符3、变量命名规则 一、PHP程序 PHP文件的默认扩展名是".php"PHP文件可以包含html、css、js 序号组成描述1<?php ... ?>PHP标记2PHP代码函数、数组、流…

二、原型模式

文章目录 1 基本介绍2 实现方式深浅拷贝目标2.1 使用 Object 的 clone() 方法2.1.1 代码2.1.2 特性2.1.3 实现深拷贝 2.2 在 clone() 方法中使用序列化2.2.1 代码 2.2.2 特性 3 实现的要点4 Spring 中的原型模式5 原型模式的类图及角色5.1 类图5.1.1 不限制语言5.1.2 在 Java 中…

Java之集合底层-数据结构

Java集合之数据结构 1 概述 数据结构是计算机科学中研究数据组织、存储和操作的一门学科。它涉及了如何组织和存储数据以及如何设计和实现不同的数据操作算法和技术。常见的据结构有线性数据结构&#xff08;含数组、链表、栈和队列等&#xff09;&#xff0c;非线性数据结构…

四、GD32 MCU 常见外设介绍(1)RCU 时钟介绍

系统架构 1.RCU 时钟介绍 众所周知&#xff0c;时钟是MCU能正常运行的基本条件&#xff0c;就好比心跳或脉搏&#xff0c;为所有的工作单元提供时间 基数。时钟控制单元提供了一系列频率的时钟功能&#xff0c;包括多个内部RC振荡器时钟(IRC)、一个外部 高速晶体振荡器时钟(H…

Meta发布最强AI模型,扎克伯格公开信解释为何支持开源?

凤凰网科技讯 北京时间7月24日&#xff0c;脸书母公司Meta周二发布了最新大语言模型Llama 3.1&#xff0c;这是该公司目前为止推出的最强大开源模型&#xff0c;号称能够比肩OpenAI等公司的私有大模型。与此同时&#xff0c;Meta CEO马克扎克伯格(Mark Zuckerberg)发表公开信&a…

力扣1792.最大平均通过率

力扣1792.最大平均通过率 每个班级加上一个人以后得通过率增量不同 将优先级最高的班级放队列顶&#xff0c;每次操作即可 class Solution {public:struct Radio{int pass;int total;//满足该条件 oth的优先级更高bool operator < (const Radio& oth)const{return (l…

【中项】系统集成项目管理工程师-第4章 信息系统架构-4.1架构基础

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

Java习题二

一题目要求&#xff1a; 二具体代码&#xff1a; package three;import sun.util.resources.LocaleData;import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.*;public class test {public static void main(String[] args) {String us…