MySQL之约束讲解

news2024/11/25 22:31:55

1. 主键约束

主键约束要求列的数据唯一,并且不能为空
主键能够唯一地标识表中的一条记录
主键和记录之间的关系如同身份证和人之间的关系,它们之间是一一对应的。

1.1 单字段主键
直接在定义列的时候指定主键即可。

create table temp1(
num int PRIMARY KEY,
name varchar(11)
);

1.2 多字段主键

主键由多个字段联合组成,规则如下:
PRIMARY KEY(字段1,字段2...)


// 多个字段联合创建主键时, 不能按照以下方式创建, 否则报错
drop table If EXISTS temp1;
create table temp1(
num int PRIMARY KEY,
id int PRIMARY KEY,
name varchar(11)
);

在这里插入图片描述


// 正确方式, 创建成功
drop table If EXISTS temp1;
create table temp1(
num int,
id int,
name varchar(11),
PRIMARY KEY(num, id)
);

2. 外键约束

外键用来在两个表的数据之间建立链接,可以是一列或多列。
一个表可以有一个或多个外键。

2.0 数据源

-- ----------------------------
-- Table structure for department
-- ----------------------------
DROP TABLE IF EXISTS `department`;
CREATE TABLE `department`  (
  `id` int(11) PRIMARY KEY COMMENT '部门id',
  `departName` varchar(255) COMMENT '部门名字'
);
-- ---------------------------
-- Records of department
-- ----------------------------
INSERT INTO `department` VALUES (111, '研发部');
INSERT INTO `department` VALUES (222, '测试部');
INSERT INTO `department` VALUES (333, '行政部');
INSERT INTO `department` VALUES (444, '后勤部');
INSERT INTO `department` VALUES (555, '仓库');

-- ----------------------------
-- Table structure for nation
-- ----------------------------
DROP TABLE IF EXISTS `nation`;
CREATE TABLE `nation`  (
  `id` int(11) PRIMARY KEY COMMENT '民族id',
  `nation` varchar(255) COMMENT '民族'
);
-- ----------------------------
-- Records of nation
-- ----------------------------
INSERT INTO `nation` VALUES (103, '回族');
INSERT INTO `nation` VALUES (101, '汉族');
INSERT INTO `nation` VALUES (104, '蒙古族');
INSERT INTO `nation` VALUES (102, '高山族');

2.1 在创建表的时候指定创建外键
格式:CONSTRAINT 外键名 FOREIGN KEY(从表字段) REFERENCES 主表名(主表字段)

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `num` int(11) PRIMARY KEY COMMENT '学号',
  `name` varchar(10) COMMENT '姓名',
  `department` int(11),
  `nation` int(11),
  CONSTRAINT `f_department` FOREIGN KEY (`department`) REFERENCES `department` (`id`),
  CONSTRAINT `f_nation` FOREIGN KEY (`nation`) REFERENCES `nation` (`id`)
);

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (101, 'zhang', 111, 101);
INSERT INTO `student` VALUES (102, 'wang', 111, 102);
INSERT INTO `student` VALUES (103, 'li', 222, 103);
INSERT INTO `student` VALUES (104, 'zhao', 111, 103);
INSERT INTO `student` VALUES (105, 'han', 222, 102);
INSERT INTO `student` VALUES (106, 'cheng', 222, 104);
INSERT INTO `student` VALUES (107, 'long', 333, 104);

如上所示,我们在studnet表中已经创建了两个外键,其分别关联了department表和nation表中的主键字段。
在这里插入图片描述
我们称student表为从表(子表),而department表和nation表为主表(父表)


在这里插入图片描述
从上可以清晰的看出,此时student表中的department列和nation列中的数据只能是来自主表中关联字段的数据,不能是其他数据,否则无法插入成功。如下所示,企图修改为5555,但是5555不是主表department中主键的数据,直接报错。
在这里插入图片描述

2.2 单独为表添加外键
格式:ALTER TABLE 从表名 ADD CONSTRAINT 外键名 FOREIGN KEY(从表字段) REFERENCES 主表名(主表字段)

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student`  (
  `num` int(11) PRIMARY KEY COMMENT '学号',
  `name` varchar(10) COMMENT '姓名',
  `department` int(11),
  `nation` int(11)
);

-- ----------------------------
-- Records of student
-- ----------------------------
INSERT INTO `student` VALUES (101, 'zhang', 111, 101);
INSERT INTO `student` VALUES (102, 'wang', 111, 102);
INSERT INTO `student` VALUES (103, 'li', 222, 103);
INSERT INTO `student` VALUES (104, 'zhao', 111, 103);
INSERT INTO `student` VALUES (105, 'han', 222, 102);
INSERT INTO `student` VALUES (106, 'cheng', 222, 104);
INSERT INTO `student` VALUES (107, 'long', 333, 104);

// 接下来, 为student创建外键, 将其与department表和nation表关联起来
ALTER TABLE student ADD CONSTRAINT `f_department` FOREIGN KEY (`department`) REFERENCES `department` (`id`);
ALTER TABLE student ADD CONSTRAINT `f_nation` FOREIGN KEY (`nation`) REFERENCES `nation` (`id`); 

2.3 删除外键

对于数据库中定义的外键,如果不再需要,可以将其删除。外键一旦删除,就会解除主表和从表间的关联关系。
格式:ALTER TABLE 表名 DROP FOREIGN KEY 外键名;

alter table student drop FOREIGN KEY f_department; 
alter table student drop FOREIGN KEY f_nation; 

2.4 外键的删除/更新行为
NO ACTION:当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与RESTRICT一致)
RESTRICT:当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与NO ACTION一致)
CASCADE:当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。
SET NULL:在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null。(这就要求该外键值允许取null)
SET DEFAULT:父表有变更时,子表将外键列设置成一个默认的值。(InnoDB不支持)

格式:ALTER TABLE 从表名 ADD CONSTRAINT 外键名 FOREIGN KEY(从表字段) REFERENCES 主表名(主表字段) ON UPDATE 行为 ON DELETE 行为

具体演示此处不再赘述,按照之前的数据自行更改测试即可。

3. 非空约束

格式:字段名 数据类型 not null
非空约束指代字段的值不能为空。对于使用了非空约束的字段,如果添加数据时没有指定值,那么直接报错。

4. 唯一性约束

格式:字段名 数据类型 UNIQUE
或者 CONSTRAINT 约束名 UNIQUE(字段)
唯一性约束要求该列唯一,允许为空,但只能出现一个空值。
唯一性约束可以保证一列或者几列的值不出现重复值。

DROP TABLE IF EXISTS `temp`;
CREATE TABLE `temp` (
  `num` int(11) UNIQUE,
  `name` varchar(255) 
) ;
DROP TABLE IF EXISTS `temp`;
CREATE TABLE `temp` (
  `num` int(11),
  `name` varchar(255),
	CONSTRAINT u_num UNIQUE(num)
) ;

5. 默认约束

格式:字段名 数据类型 DEFAULT 默认值
默认约束用来指定某列的默认值。如果插入记录时没有为该字段赋值,那么系统会自动为这个字段赋值为指定的默认值。


设置表的属性自动增加:字段 数据类型 auto_increment

mysql> create table student (
    -> num int  comment "学号" PRIMARY KEY auto_increment,
    -> name varchar(10)  default "zhang" comment "姓名" not null
    -> );
Query OK, 0 rows affected (0.27 sec)

mysql> desc student
    -> ;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| num   | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10) | NO   |     | zhang   |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

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

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

相关文章

高通 Android 13 兼容extfat模式

Android本身不支持extfat格式 需要通过nofuse 打kernel补丁方式去实现 1、kernel/msm-4.19/arch/arm64/configs/vendor/device-perf_defconfig 增加 diff --git a/kernel/msm-4.19/arch/arm64/configs/vendor/device-perf_defconfig b/kernel/msm-4.19/arch/arm64/configs/ve…

导航栏模糊背景 out 了? 来看看这种模糊是否合你胃口? 并且学习 backdrop-filter

导航栏模糊背景 out 了? 来看看这种模糊是否合你胃口? 并且学习 backdrop-filter 传统情况模糊导航栏效果 🆚 一种比较新的模糊导航栏效果(比如 Element-Plus 官网的导航栏效果, 有些类似密集点阵式) 导航栏要实现这个效果必须设置背景为有透明的颜色并且通过 ba…

Docker安装常用软件-Apollo

零:apollo概念介绍 官网网站:GitHub - apolloconfig/apollo: Apollo is a reliable configuration management system suitable for microservice configuration management scenarios. gitee网址:mirrors / ctripcorp / apollo GitCode …

家用电器-电磁炉加热原理及实现

目录 一、历史 二、基本原理 三、电路组成 3.1 控制电路 3.2 电源电路 3.3 电磁线圈及驱动电路 3.4 传感器电路 3.5 散热-风扇 四、电磁炉的核心部件 五、电磁炉特点 5.1 加热速度快 5.2 热效率高 5.3 加热的均匀性 六、国内电磁炉市场 参考资料 一、历史 电磁炉…

【Python入门】Python的判断语句(if else 语句)

前言 📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步,喜爱音乐的一位博主。 📗本文收录于Python零基础入门系列,本专栏主要内容为Python基础语法、判断、循环语句、函…

idea调优|maven调优

一、idea调优 1、idea启动优化 首先打开idea->Help->Edit Custom VM Options 按如下配置调整既有参数,参数数值不固定,需根据开发环境配置适当调整。针对如下配置#号后面的为注释,配置时需删除 # 启动堆大小 -Xms2048m # 最大运行堆…

SpringCloud-OpenFeign案例实战

关于Spring Cloud Open Feign的介绍可以参考这两篇博客 OpenFeign服务接口调用 使用Feign作为服务消费者 本博客参考gitee开源项目代码,结合自己的理解,记录下微服务场景下的使用。Talk is cheap. Show me the code! 一、项目结构 这里使用…

FJUT第17届校赛题解

致歉 由于出题人经验不足,给大家带来不好的体验,实在抱歉。在赛中忘记开答疑,发不了公告,发现的问题已经在尽量修补。出现的问题如下(均修复): 1.薛薛的简单数学题,没写spj&#xf…

【Python从入门到进阶】18、文件内容序列化和反序列化操作

接上篇《17、文件的读写操作》 上一篇我们学习了Python文件对象包含哪些方法,并学习了文件如何进行读、写、定位和删除。本篇我们来学习文件读取及写入数据序列化和反序列化的操作。 一、什么是序列化和反序列化 通过文件操作,我们可以将字符串写入到一…

【Linux】 OpenSSH_7.4p1 升级到 OpenSSH_8.7p1(亲测无问题,建议收藏)

🍁博主简介 🏅云计算领域优质创作者   🏅华为云开发者社区专家博主   🏅阿里云开发者社区专家博主 💊交流社区:运维交流社区 欢迎大家的加入! 文章目录 文章声明前述安装一些必要的命令&…

MySQL数据库学习(进阶篇)

1.存储引擎 1.1 MySQL体系结构 连接层 最上层是一些客户端和链接服务,主要完成一些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。 服务层 第二层家口主要完成大多数的核心服务功能,如SQL接口…

二挡起步——pythonweb开发Django框架,前端原生+Django后端框架+python网络抓包(代替数据库数据)(附带小案例)

大家好,我是csdn的博主:lqj_本人 这是我的个人博客主页: lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

Java8新特性—Stream API

前言 Java 8引入了Stream API,这是一种新的API,可让开发人员更轻松地处理集合数据。 Stream API提供了丰富的操作,如过滤、映射、排序和规约。下面将对Stream API的基本语法、使用场景和示例进行介绍。 基本语法 Stream API是Java 8中处理…

玄子Share- Maven 3 安装配置教程(含安装包)

玄子Share- Maven 3 安装配置教程(含安装包) 下载 下载链接 官网 https://maven.apache.org/index.html 下载教程 进入 Maven 官网,点击左侧导航栏,Download下载。 下方选择安装类型,选择.zip后缀文件&#xff0c…

Linux系统通过Docker安装Elasticsearch、部署kibana

Docker安装和基本操作 一、安装Elasticsearch 1.1.创建网络 因为我们还需要部署kibana容器,因此需要让es和kibana容器互联。这里先创建一个网络: docker network create es-net1.2.拉取 docker pull elasticsearch:7.12.11.3.运行 运行docker命令…

8-3分治

引入 分治算法(divide and conquer)是五大常用算法(分治算法、动态规划算法、贪心算法、回溯法、分治界限法)之一。其实,很多人在平时学习中已经不知不觉就用到了分治算法,只是不知道那就是分治算法,今天,…

Word Embedding

One-hot-encoding 缺点 1.向量维度和向量个数很大,假设有1w个token的话,向量个数和维度就都是1w 2. 语义相近的词的向量并不相似 Word Embedding 核心思想:可以通过上下文理解单词的语义 predection-based方法 使用前一个单词预测下一个…

【前端】1、flex 布局详解

flex 布局目录 一、flex container 和 flex items二、用在 flex container 上的 CSS 属性(1) flex-direction(2) justify-content(3) align-items(4) flex-wrap(5) flex-flow(6) align-content 三、用在 flex items 上的 CSS 属性(1) order(顺序)(2) ali…

【Linux】Linux下的基本指令

😛作者:日出等日落 📘 专栏:数据结构 人生就是这样,要耐的住寂寞,才守得住繁华。 —— 七堇年 目录 Linux的基本命令(常用): ls 指令: pwd指…

告别混乱代码,这份 SpringBoot 后端接口规范太及时了

告别混乱代码,这份 SpringBoot 后端接口规范太及时了! 文章目录 一、前言 二、环境说明 三、参数校验 1、介绍2、Validator 自动抛出异常(使用)3、分组校验和递归校验4、自定义校验 四、全局异常处理 1、基本使用2、自定义…