MySQL数据库——约束

news2024/11/25 3:39:52

在这里插入图片描述

文章目录

  • 前言
  • 主键约束
    • 创建主键
      • 单列主键
      • 联合主键
      • 通过修改表结构来指定主键
    • 删除主键约束
  • 自增主键约束
    • 创建自增主键
  • 非空约束
    • 创建非空约束
    • 删除非空约束
  • 唯一约束
    • 创建唯一约束
    • 删除唯一性约束
  • 默认约束
    • 创建默认约束
    • 删除默认约束(改为null为默认值)
  • 零填充约束
    • 创建零填充约束
    • 删除零填充约束
  • 外键约束
    • 创建外键约束
    • 删除外键约束

前言

MySQL约束是用于在关系型数据库中定义和实施数据完整性规则的规范。它们定义了数据库表中数据的限制条件,确保数据的一致性和有效性。

今天我将为大家分享以下约束:

  1. 主键约束(primary key)
  2. 自增长约束(auto_incremnet)
  3. 非空约束(not null)
  4. 唯一性约束(unique)
  5. 默认约束(default)
  6. 零填充约束(zerofill)
  7. 外键约束(foreign key)

主键约束

MySQL主键约束是一种用于保证表中数据唯一性和完整性的约束类型。主键是一个或多个列的组合,用于标识表中的唯一记录。主键约束要满足以下条件:

  1. 唯一性:主键的值在整个表中必须是唯一的。任意两个记录都不能具有相同的主键值。

  2. 非空性:主键的值不能为空。每个记录都必须具有一个非空的主键值。

  3. 唯一标识:主键作为表中每个记录的唯一标识。它可以用来在表中查找、更新和删除记录。

当创建主键约束时,系统默认会在所在的列和列组合上建立对应的唯一索引。

创建主键

主键有两种形式,一种是单列主键,第二种是联合主键。

单列主键

MySQL中创建单列主键有两种方式:一种是在我们创建表的时候,在对应列的后面指定主键,另外一种就是我们在创建完列之后指定主键

在创建表的时候指定主键

create table student1(id int primary key,name varchar(20));

在这里插入图片描述

在创建列之后指定主键

create table student1(id int,name varchar(20),constraint pk1 primary key(id));

这里 contrain pk1 可以省略,这种是 primary key 的完整写法,pk1 是约束名,可以自定义。

在这里插入图片描述

联合主键

联合主键是指将表中的多个列共同当作主键,可以出现某个列相同,但不允许所有对应的列都相同,并且不能含有null。

创建联合主键只有一种方法:
create table 表名(列名1 类型,列名2 类型,列名3 类型,constraint pk2 primary key(列名1,列名2));

create table student1(id int,name varchar(20),constraint pk1 primary key(id,name));

在这里插入图片描述

当出现某一列重复的时候,可以插入数据,但是当联合主键的对应列都相同的时候就插入失败。

insert into studen1 values(1,'张三');
insert into studen1 values(1,'李四');

在这里插入图片描述

insert into student1 values(2,'王五');
insert into student1 values(2,'王五');

在这里插入图片描述

任何一列都不能出现null

insert into student1 values(3,null);

在这里插入图片描述

通过修改表结构来指定主键

我们可以在创建完成表之后再指定主键 alter table 表名 add primary key(列名);
alter table 表名 add primary key(列名1,列名2)

create table student1(id int,name varchar(20));
alter table student1 add primary key(id);

在这里插入图片描述

create table student1(id int,name varchar(20));
alter table student1 add primary key(id,name);

在这里插入图片描述

删除主键约束

当不想使用主键的时候,可以使用 alter table 表名 drop primary key; 删除主键。
在这里插入图片描述
删除主键的时候,不管你是单列主键还是联合主键都使用 alter table 表名 drop primary key;

自增主键约束

MySQL自增主键是一种特殊类型的主键约束,它使用自动递增的值为每个新插入的记录生成唯一的标识符。自增主键允许无需手动指定主键值即可向表中插入记录,并确保每个记录都具有唯一的标识符。

使用自增主键具有以下优点:

  1. 简化数据插入:无需手动指定主键值,数据库会自动为每个新插入的记录分配一个唯一的主键值。这简化了插入操作的编码工作,并减少了出现冲突的可能性。

  2. 唯一性保证:自增主键的值在表中是唯一的,避免了手动管理主键冲突的问题。

  3. 快速访问:自增主键的值按顺序递增,这有助于提高基于主键的查询和索引操作的性能。

自增主键的特点:

  • 默认情况下, auto_increment 的初始值是 1 ,每新增一条记录,字段值自动加 1
  • 一个表中只能有一个字段使用 auto_increment 约束,且该字段必须有唯一索引,以避免序号重复(即为主键或主键的一部分)。
  • auto_increment 约束的字段必须具备 NOT NULL 属性。
  • auto_increment 约束的字段只能是整数类型( TINYINT 、 SMALLINT 、 INT 、 BIGINT 等。
  • auto_increment 约束字段的最大值受该字段的数据类型约束,如果达到上限, auto_increment 就会失效。

创建自增主键

因为自增主键是特殊的主键,所以主键和自增主键需要指定到同一列中。

create table 表名 (列名1 类型 primary key auto_increment,列名2 类型);

create table student1(id int primary key auto_increment,name varchar(20));

在这里插入图片描述
当某一列被设置为自增主键时,我们插入数据的时候,可以传入null,该列数据会被默认为从1开始的自增数据(在没有定义自增初值的时候)。

insert into student1 values(null,'张三');

在这里插入图片描述

为自增主键赋初值
我们可以指定自增数据从哪开始,为自增数据指定初值。

create table student1(id int primary key auto_increment,name varchar(20)) auto_increment=值;

create table student1(id int primary key auto_increment,name varchar(20)) auto_increment=100;
insert into student1 values(null,'张三');

在这里插入图片描述

在创建表之后为自增主键赋初值

alter table 表名 auto_increment=初始值;

create table student1(id int primary key auto_increment,name varchar(20));
alter table student1 auto_increment=100;
insert into student1 values(null,'张三');

在这里插入图片描述

delete 和 truncate 在删除后自增列的变化

  • delete 数据之后自动增长从断点开始
  • truncate 数据之后自动增长从默认起始值开始
insert into student1 values(null,'张三');
insert into student1 values(null,'李四');
delete from student1;
insert into student1 values(null,'王五');

在这里插入图片描述

truncate student1;
insert into student1 values(null,'李华');

在这里插入图片描述

非空约束

MySQL非空约束是一种用于确保表中某列不允许包含空值(NULL)的约束类型。非空约束要求在插入或更新数据时,该列必须包含有效的值。非空约束可以应用于单个列或多个列。

创建非空约束

MySQL创建非空约束有两种方式:第一种是我们在创建表的时候指定非空约束
create table 表名(列名1 类型 not null,列名2 类型); 第二种就是我们创建完成表之后指定非空约束 alter table 表名 modify 列名 类型 not null;

create table student1(id int not null,name varchar(20));
desc student1;

在这里插入图片描述

create table student1(id int,name varchar(20));
alter table student1 modify id int not null;
desc student1;

在这里插入图片描述

insert into student1 values(null,'张三');

在这里插入图片描述

删除非空约束

alter table 表名 modify 列名 类型;

alter table student1 modify id int;
desc student1;

在这里插入图片描述

唯一约束

MySQL唯一约束是一种用于确保表中某列或多列的数据是唯一的约束类型。唯一约束保证了列中的值都是互不相同的,但允许包含一个或多个空值(NULL)。

创建唯一约束

MySQL中创建唯一约束同样有两种方法:创建表时指定唯一约束:create table 表名(列名1 类型 unique,列名2 类型); 创建表之后指定唯一约束:alter table 表名 add constraint unique_pn unique(列名); 这里constraint 约束名 不省略,为后面的删除唯一约束做准备。

create table student1(id int constraint unique_pn unique,name varchar(20));
insert into student1 values(1,'张三');
insert into student1 values(1,'李四');

在这里插入图片描述

create table student1(id int,name varchar(20));
alter table student1 add constraint unique_pn unique(id);
insert into student1 values(1,'张三');
insert into student1 values(1,'李四');

在这里插入图片描述

删除唯一性约束

删除唯一性约束的时候需要用到我们前面定义的约束名。
alter table 表名 drop index 唯一约束名

alter table student1 drop index unique_pn;

如果你前面没有定义唯一约束名,那么默认就是你设置唯一约束的列名。

默认约束

MySQL默认约束是在创建表时,为表中的某个列定义的一个默认值规则。当插入新的记录时,如果未显式提供该列的值,MySQL会自动将默认值应用于该列。默认约束可以是一个具体的值,也可以是一个表达式、函数或系统变量。

创建默认约束

我们MySQL默认的默认约束是null,那么我们也可以自己设置默认值。在创建表的同时指定默认约束: create table 表名(id int default 默认值,name varchar(20) default 默认值); 在创建表之后指定默认约束 alter table 表名 modify 列名 default 默认值;

create table student1(id int,name varchar(20) default '无名氏');
desc student1;

在这里插入图片描述

alter table student1 modify name default '无名氏';

在这里插入图片描述

删除默认约束(改为null为默认值)

alter table 表名 类型 modify 列名 default null;

alter table student1 varchar(20) modify name default null;

在这里插入图片描述

零填充约束

MySQL零填充约束是一种用于整型数据列的约束,它定义了在插入或更新数据时如何处理数值长度不足的情况。当一个整型数据列的数值长度小于定义的长度时,MySQL会使用零填充方式来补足。

  • 插入数据时,当该字段的值的长度小于定义的长度时,会在该值的前面补上相应的 0
  • zerofill 默认为 int(10)
  • 当使用 zerofill 时,默认会自动加 unsigned (无符号)属性,使用 unsigned 属性后,数值范围是原值的 2 倍,例如,有符号为 -128 ~ +127 ,无符号为 0 ~ 256

创建零填充约束

create table 表名(列名1 类型(指定宽度) zerofill,列名2 类型);

create table student1(id int(5) zerofill,name varchar(20));
insert into student1 values(1,'张三')

在这里插入图片描述

删除零填充约束

alter table 表名 modify 列名 类型;

alter table student1 modify id int;
insert into student1 values(2,'李四');

在这里插入图片描述
零填充约束只是显示的时候是用0填充的,但是加上表中的内容没有变化。

外键约束

在学校中,我们都知道每个学生都有对应的班级,同样在MySQL中也可以将这种类似的关系体现出来。

外键用于关联其他表的主键或唯一键

创建外键约束

create table 表名 (列名 类型 foreign key (列名) references 另一个表名(关联的列名));
create table class (classId int primary key auto_increment,name varchar(20));
create table student (studentId int primary key auto_increment,name varchar(20),classId int,
     foreign key (classId) references class(classId));
desc student;

在这里插入图片描述

既然是学生,那么肯定要先有班级然后学生才能进入班级,并且学生不能进入不存在的班级。

insert into class (null,'高三1班');
insert into class values (null,'高三2班');
insert into class values (null,'高三3班');
insert into student values (null,'张三',1);
insert into student values (null,'李四',4);

在这里插入图片描述
在这里插入图片描述

删除外键约束

当插入的数据在外键对应的列中不含有时,就会报错。并且在以上的外键关系中,class为父表,student为子表,子表的插入和删除都受到父表的约束,同时父表的删除也受到子表的约束。

update student set classId = 5;
delete from class where classId = 1;

在这里插入图片描述
子表的修改,对应的列修改后的数据还是需要在父表中存在。父表删除的时候,如果子表与其有关联,那么就删除不了,只能先删除掉子表的对应行,然后再删除父表。

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

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

相关文章

安装Vue浏览器插件vue.Devtools(小白无压力教程)

1、打开网址:选择vue.js.Devtoolshttps://chrome.zzzmh.cn/index#/search极简插件是一个优质Chrome插件扩展收录下载网站,收录热门好用的Chrome插件扩展,国内最方便的插件下载网站。https://chrome.zzzmh.cn/index#/search 2、下载安装包后,…

【论文简述】DIP: Deep Inverse Patchmatch for High-Resolution Optical Flow(CVPR 2022)

一、论文简述 1. 第一作者:Rui Li 2. 发表年份:2023 3. 发表期刊:CVPR 4. 关键词:光流、深度学习、PatchMatch、局部搜索 5. 探索动机:对于深度学习来说,除了准确性之外,性能和内存也是一个…

基于 FFlogs API 快速实现的 logs 颜色查询小爬虫

文章目录 找到接口解析响应需要平均颜色和过本次数? 找到接口 首先试了一下爬虫,发现和wow一样官网上有暴露的 API,链接在:FFlogs v1 API 文档链接 通过查询官方提供的 API 接口得知: user_name 角色名字 api_key …

解决安装VMware Tools灰色问题,解决重新安装VMware Tools灰色问题

一、环境 vmware 版本:17.0.0 build-20800274 centos 9 二、问题 安装VMware Tools 按钮为灰色 三、解决方法 网上很多写这些如何解决该问题的,如:配置CD/DVD(SATA)为自动检测,或者指定其CD镜像文件为…

3个命令定位CPU飙高

top 指令找出消耗CPU最厉害的那个进程的pid top -H -p 进程pid 找出耗用CPU资源最多的线程pid printf ‘0x%x\n’ 线程pid 将线程pid转换为16进制 结合jstack 找出哪个代码有问题 jstack 进程pid | grep 16进制的线程pid -A 多少行日志 jstack 进程pid | grep 16进制的线程…

DP-GAN-判别器代码

将输出的rgb作为输入,输入到判别器中。接着执行一个for循环,看一下body_down列表的组成和x经过body_down之后的值。 body_down是由残差块D组成的列表: 残差块的参数为:(3,128),(128,128),(128,256),(256,256),(256,512),(512,5…

虹科分享 | 关于内存取证你应该知道的那些事

什么是内存取证? 内存取证是指在计算机或其他数字设备运行时,通过对其随时存储的内存数据进行采集、分析和提取,以获取有关设备状态、操作过程和可能存在的安全事件的信息。内存取证是数字取证的一个重要分支,用于从计算机的RAM&…

前端自动化测试:确保质量和稳定性的关键步骤

文章目录 测试金字塔与前端测试层级1. 单元测试(Unit Testing)2. 组件测试(Component Testing)3. 集成测试(Integration Testing)4. 端到端测试(End-to-End Testing) 单元测试、集成…

学习购药系统源码:从前端到后端的技术探索

本文将带领读者探索购药系统源码,从前端到后端逐步深入,了解其核心功能和实现方式。我们将使用常见的Web技术,包括HTML、CSS、JavaScript、以及Python的Django框架,展示购药系统的技术奥秘。 前端技术探索 HTML结构搭建 购药系…

3ds Max如何进行合成的反射光泽通道渲染

推荐: NSDT场景编辑器 助你快速搭建可二次开发的3D应用场景 1. 准备场景 步骤 1 打开 3ds Max。smart_phone.max打开已 随教程提供。 打开 3ds Max 步骤 2 按 M 打开材质编辑器。选择空材料 槽。单击漫射通道。它将打开材质/贴图浏览器窗口。选择位图&#xff0…

DAY01_Spring简介IOC、DI入门案例Bean基础配置Bean实例化Bean生命周期依赖注入(DI配置)

目录 一 Spring1 Spring简介1.1 为什么要学1.2 学什么1.3 怎么学 2 初识Spring2.1 Spring家族2.2 Spring发展史 3 Spring体系结构问题导入3.1 Spring Framework系统架构图3.2 Spring Framework课程学习路线 4 Spring核心概念问题导入4.1 目前我们代码存在的问题4.2 核心概念 二…

【Linux 网络】 传输层协议之UDP协议

UDP协议 UDP协议的位置UDP协议的特点UDP协议的格式UDP使用注意事项 UDP协议的位置 在网络套接字编程时用到的各种接口,是位于应用层和传输层之间的一层系统调用接口,这些接口是由系统提供的。我们可以通过这些接口来搭建上层应用,比如HTTP协议…

如何解决制造业数字化改造的障碍?

制造业的数字化转型可能是一个复杂且具有挑战性的过程,但解决以下障碍有助于为成功实施铺平道路: 抵制变革:数字化转型中最常见的挑战之一是员工的抵制,尤其是那些习惯传统方法的员工。为了克服这一问题,组织需要培养一…

Redis 简介

文章目录 Redis 简介 Redis 简介 Redis(Remote Dictionary Server),远程词典服务器,基于 C/S 架构,是一个基于内存的键值型 NoSQL 数据库,开源,遵守 BSD 协议,Redis 由 C语言 实现。…

深入理解设计模式之门面模式

深入理解设计模式之门面模式 什么是门面模式? 门面模式(Facade Pattern)是一种结构型设计模式,它提供了一个简单的接口,用于访问复杂子系统中的一组接口。门面模式通过封装子系统的复杂性,提供了一个更简…

解决联想小新耳机孔没声音问题

联想小新电脑AMD,今天突然遇到扬声器有声音、蓝牙耳机也有声音、耳机孔插上耳机没有声音。 话不多说,直接上解决办法,亲测有用: (1)“此电脑”右键,选“管理” (2)进入…

第1集丨Vue 江湖 —— Hello Vue

目录 一、简介1.1 参考网址1.2 下载 二、Hello Vue2.1 创建页面2.2 安装Live Server插件2.4 安装 vue-devtools2.5 预览效果 一、简介 Vue(读音 /vjuː/, 类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是,Vue 被设…

idea插件开发-自定义语言5-References and Resolve

实现自定义语言 PSI 中最重要和最棘手的部分之一是解析References。解析References使用户能够从 PSI 元素的使用(访问变量、调用方法等)导航到该元素的声明(变量的定义、方法声明等)。其实就是实现Navigate | Declaration or Usag…

OpenCVForUnity(十)扩张与侵蚀效果

文章目录 前言扩张案例展示 侵蚀案例展示 结语: 前言 在这个教程中,您将学习两种常见的图像形态运算符:侵蚀和膨胀。为此,您将使用OpenCV库中的两个函数:erode 和 dilate。 形态操作是一组基于形状的图像处理操作。形态…

java+springboot+mysql校园宿舍报修管理系统

项目介绍: 使用javaspringbootmysql开发的校园宿舍报修管理系统,系统包含管理员、维修员、学生角色,功能如下: 管理员:楼栋管理、宿舍管理、维修人员管理、学生管理;报修管理(派单给维修员&am…