MySQL_7 常见约束及演示

news2025/1/12 10:56:08

目录

一、约束概述

二、 PRIMARY KEY(主键)

        1.作用 : 

        2.格式 : 

        3.自增长 : 

        4.演示 : 

                演示Ⅰ—— 主键约束的特点

                演示Ⅱ—— 复合主键

                演示Ⅲ—— 自增长                

三、UNIQUE(唯一)

        1.作用 : 

        2.格式 : 

        3.演示 : 

四、FOREIGN(外键) 

        1.作用 : 

        2.格式 : 

        3.演示 : 

五、CHECK(检查) 

        1.作用 : 

        2.格式 : 

        3.演示 : 


一、约束概述

        约束用于确保数据库的数据满足特定的商业规则。MySQL中的常见约束有NOT NULL(非空), PRIMARY KEY(主键), FOREIGN KEY(外键), UNIQUE(唯一)CHECK(检查)五种。


二、 PRIMARY KEY(主键)

        1.作用 : 

        主键用于唯一的标示表中的数据,当对表中某个字段定义主键约束后,该列的数据不允许重复。在实际开发中,一般情况下每个表都会定义一个主键约束。

        2.格式 : 

        方式一 :        

        字段名  字段类型  PRIMARY KEY

        方式二 : 

        PRIMARY KEY(字段名)

        注意事项——
        定义主键约束的字段不允许重复,且不允许为空

        一张表最多只能有一个主键,但可以定义一个复合主键,格式为在定义表的字段的最后,加上一行"PRIMARY KEY(column_1, column_2...)",定义复合主键后,要求向表添加数据时,复合主键约束的字段不能完全相同,即允许有不完全相同

        使用DESC table_name可以快速查看表的主键。

        3.自增长 : 

        定义自增长是为了使表中的某个整型字段(eg : id)能够从1开始自动的增长

        定义格式如下 : 

        字段名 整型 PRIMARY KEY AUTO_INCREMENT

        使用格式如下 : 

        INSERT INTO table_name(column1,column2...) VALUES(NULL, val2...);
        INSERT INTO table_name(column2,column3...) VALUES(val2,val3...);

        INSERT INTO table_name VALUES(NULL, val2...);

        PS :

        1>传入1>NULL给定义了自增长的字段,实际会自动将1,2,3,4.....传给该字段
       
2>一般地,自增长都会和PRIMARY KEY 一起配合使用,但也可以单独使用(需要UNIQUE约束的配合)。

        3>一般地,自增长修饰的字段均为整型;实际浮点型也可以,但是使用频率非常低。

        4>自增长默认从1开始,可以通过ALTER TABLE table_name AUTO_INCREMENT = ___; 语句来修改。

        5>若向自增长修饰的字段传入了一个指定值,则以指定值为准进行自增长。并且,一般地,若程序员手动指定了自增长的默认值,就按照指定后自增长的规则来添加数据。(要专一)

        4.演示 : 

                演示Ⅰ—— 主键约束的特点

                先来创建一张水果表,并定义水果编号字段fno为主键代码如下 : 

CREATE TABLE IF NOT EXISTS `fruit`(
		`fno` MEDIUMINT PRIMARY KEY,
		`fname` VARCHAR(64) NOT NULL DEFAULT '',
		`fswe` TINYINT NOT NULL DEFAULT 0
) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;

INSERT INTO `fruit`
        VALUES
        (1, 'apple', 13),
        (2, 'watermelon', 12),
        (3, 'grape', 17);
			
SELECT * FROM fruit;

                水果表如下 : 

                尝试向水果表中添加"fno = 2,但fname和fswe均与表中已存在记录不同"的数据,如下 : 

INSERT INTO `fruit`
		VALUES
		(2, 'pear', 10);

                这时Navicat会报错,提示主键不允许重复,如下图所示 : 

                继续,尝试向水果表中添加fno = 4,但fname和fswe均与表中已存在记录相同的数据,如下 : 

INSERT INTO `fruit`
		VALUES
		(4, 'grape', 17);
			
SELECT * FROM fruit;

                继续,尝试向水果表中添加fno = NULL的数据,如下 : 

INSERT INTO `fruit`
		VALUES
		(NULL, 'fruit', 999);

                Navicat会报错,提示fno不为空,如下 : 

                可以使用DESC fruit来查看水果表的接口,如下 : 

                可以看到fno字段做了PRI(主键)的标记。 

                演示Ⅱ—— 复合主键

                定义一个新的水果表fruit_2,并为其字段fno和fname设置复合主键约束代码如下 : 

CREATE TABLE IF NOT EXISTS `fruit_2`(
		`fno` MEDIUMINT,
		`fname` VARCHAR(64),
		`fcolor` VARCHAR(32) NOT NULL DEFAULT '',
		PRIMARY KEY(fno,fname)
) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;

INSERT INTO `fruit_2`
		VALUES
		(1, 'watermelon', 'green'),
		(2, 'apple', 'red'),
		(3, 'grape', 'purple');
		
SELECT * FROM fruit_2;

                fruit_2水果表如下: 

                尝试向fruit_2水果表中添加fno = 3,fname = 'grape_2'的数据,如下 : 

INSERT INTO `fruit_2`
		VALUES
		(3, 'grape_2', 'purple');
		
SELECT * FROM fruit_2;

                尝试向水果表fruit_2中添加fno = 3, fname = 'grape', fcolor = 'blue'的数据,如下 : 

INSERT INTO `fruit_2`
		VALUES
		(3, 'grape', 'blue');

                同样提示主键 '3-grape' 不能重复。
                继续,使用DESC查看fruit_2的表结构,如下 : 

                演示Ⅲ—— 自增长                

                先来建一张学生表,指定id为主键并且设置自增长代码如下 : 

CREATE TABLE IF NOT EXISTS `student_demo`(
		`id` MEDIUMINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
		`name` VARCHAR(255) NOT NULL DEFAULT '',
		`sex` CHAR(32) CHECK(sex IN ('male','female'))
) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;

                向学生表中添加数据,代码如下 : 

INSERT INTO `student_demo`(id,`name`,sex)
		VALUES
		(NULL,'Cyan','male'),
		(NULL,'Ice','male');
		
INSERT INTO `student_demo`(`name`,sex)
		VALUES
		('Rain','female'),
		('Five','female');
		
ALTER TABLE `student_demo`
		AUTO_INCREMENT = 100;
INSERT INTO `student_demo`
		VALUES
		(NULL,'Kyrie','male'),
		(NULL,'James','male');
		
SELECT * FROM student_demo;

                自增长效果如下 : 


三、UNIQUE(唯一)

        1.作用 : 

        当某个字段定义了UNIQUE约束后,表示该列数据的值是唯一的,不能重复。

        2.格式 : 

        字段名 字段类型 UNIQUE

        注意事项——

        对于UNIQUE约束的字段,若没有定义NOT NULL约束,则该字段是允许有多个NULL的。

        一张表可以有多个UNIQUE约束的字段。

        仍然可以在DESC显示出的表结构中,查看表中约束条件的情况。

        3.演示 : 

                先来建一张水果表fruit_3,玩儿得花一点,对表中所有字段都添加UNIQUE约束,代码如下 : 

CREATE TABLE IF NOT EXISTS `fruit_3`(
		`fno` MEDIUMINT UNIQUE NOT NULL,
		`fname` VARCHAR(64) UNIQUE,
		`fswe` TINYINT UNIQUE,
		`fcol` VARCHAR(32) UNIQUE
) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;

INSERT INTO `fruit_3`
		VALUES
		(1, 'apple', 13, 'red'),
		(2, 'pear', 10, 'yellow'),
		(3, 'watermelon', 15, 'green');
		
SELECT * 
		FROM `fruit_3`;

                尝试向表中添加fno = 4,fname = 'pear', fswe = 11, fcol = NULL的数据,如下 : 

INSERT INTO `fruit_3`
		VALUES
		(4, 'pear', 11, NULL);

                可以看到,Navicat会报错,并提示fname字段有重复内容。 
                继续,尝试向表中添加多个fcol = NULL的数据,如下 : 

INSERT INTO `fruit_3`
		VALUES
		(4, 'grape', 16, NULL),
		(5, 'grape_2', 17, NULL),
		(6, 'strawberry', 18, NULL);
		
SELECT * 
		FROM `fruit_3`;

                同样,可以使用DESC查看fruit_3表的结构,如下图所示 : 

                可以看到,同时定义了UNIQUE与NOT NULL约束的字段,就相当于一个主键约束的字段。 


四、FOREIGN(外键) 

        1.作用 : 

        外键用于定义主表和从表之间的关系。外键约束要定义在从表上主表则必须具有PRIMARY KEY约束或UNIQUE约束

        当从表中的字段定义了外键约束后,要求该字段的数据必须在主表的主键列存在或者为NULL(注意此处指的是从表中的数据为NULL,且前提是主表对应的字段允许为空),否则无法向从表中添加数据;并且,如果想删除主表主键列的某条数据,必须要求从表中没有相应的数据与之关联,即在外键约束下,数据无法任意删除

        2.格式 : 

        FOREIGN KEY (本表字段名) REFERENCES 主表名(主键名或UNIQUE字段名)
        注意事项——
       
外键关系要在创建表时单独定义,类似于单独定义主键的方式,写在字段的最后。

        INNODB类型的表才支持外键

        外键约束的字段类型要和对应主键的字段类型一致(长度可以不同)

        若一张从表中要定义多个外键(即与多张主表发生关联), 则不同的外键要单独定义。

        3.演示 : 

                建立如下的主表与从表关系 : (主表为班级表classes,从表为学生表stus)

                代码如下 : 

# 创建主表(先创建主表)
CREATE TABLE IF NOT EXISTS `classes`(
		`c_id` MEDIUMINT PRIMARY KEY,
		`c_name` VARCHAR(32) NOT NULL DEFAULT '',
		`c_tuition` DECIMAL(8,2)
) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;

# 创建从表
CREATE TABLE IF NOT EXISTS `stus`(
		`s_id` MEDIUMINT UNIQUE NOT NULL,
		`s_name` VARCHAR(64) NOT NULL DEFAULT '',
		`s_classId` MEDIUMINT,
		FOREIGN KEY (s_classId) REFERENCES classes(c_id)
) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;

                先向主表中添加数据,如下 : 

INSERT INTO `classes`
        VALUES
        (55, 'Java', 20000.0),
        (76, 'C++', 15000.0),
        (141, 'Python', 12000.0);
			
SELECT * FROM classes;

                尝试向从表中添加s_classId字段在主表中不存在的数据,如下 : 

INSERT INTO `stus`
		VALUES
		(1, 'Cyan', 50),
		(2, 'Five', 75),
		(3, 'Rain', 140);

                显然不成功。将s_classId改为在主表中c_id字段存在的值,再次尝试添加,如下 : 

INSERT INTO `stus`
		VALUES
		(1, 'Cyan', 55),
		(2, 'Five', 76),
		(3, 'Rain', 141);
		
SELECT * FROM `stus`;

                尝试删除主表中的某条记录,由于此时在从表中定义了外键约束,并且已经有相关记录与之关联,所以一定会删除失败,如下 : 

DELETE FROM `classes`
		WHERE c_id = 141;

                删除从表中与主表主键某个数据相关联的全部记录,便可以删除主表中主键的该数据。如下 : 

DELETE FROM `stus`
		WHERE s_classId = 141;
DELETE FROM `classes`
		WHERE c_id = 141;
SELECT * FROM classes;


五、CHECK(检查) 

        1.作用 : 

        CHECK用于强制限制行数据必须满足的条件若某个字段使用CHECK约束进行了修饰,那么向表中添加记录时,要求这一具体的字段必须满足CHECK约束的条件,否则报错
        PS : 

        Oracle 和 SQL Server均支持CHECK,MySQL8.0开始也支持CHECK(MySQL5.7版本仅支持CHECK的语法校验,但并不会实际生效)。

        2.格式 : 

        字段名 字段类型 CHECK(check_expression)

        注意事项——
       
在MySQL中实现CHECK的功能,一般是在程序中控制,或者通过触发器来完成。

        3.演示 : 

                先来建一张水果表,要求水果名必须带grape,并且要求水果的甜度必须大于等于10。代码如下 : 

CREATE TABLE IF NOT EXISTS `fruit_EX`(
		`f_id` MEDIUMINT PRIMARY KEY,
		`f_name` VARCHAR(64) CHECK(f_name LIKE '%grape%'),
		`f_swe` TINYINT NOT NULL DEFAULT 10 CHECK(f_swe >= 10)
) CHARACTER SET utf8mb3 COLLATE utf8mb3_bin ENGINE INNODB;

                尝试向表中添加不符合CHECK约束的记录,如下 : 

INSERT INTO `fruit_EX`(f_id, f_name, f_swe)
		VALUES
		(1, 'red_grape', 9),
		(2, 'green_grape', 8),
		(3, 'pueple_grape', 7),
		(4, 'violet_grape', 6),
		(5, 'what?', 11);

                Navicat会报错,提示不满足CHECK约束条件,如下 :  

                将其修改为复合CHECK约束条件的记录,并再次尝试添加,如下 : 

INSERT INTO `fruit_EX`(f_id, f_name, f_swe)
		VALUES
		(1, 'red_grape', 19),
		(2, 'green_grape', 18),
		(3, 'pueple_grape', 17),
		(4, 'violet_grape', 16),
		(5, 'grape_grape', 11);
		
SELECT * FROM fruit_EX;

        System.out.println("END------------------------------------------------------------------------------");

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

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

相关文章

人多岗位少,都快把我卷死了,这是今年软件测试就业的真实写照,也是所有岗位的真实写照。

前两天跟一个HR朋友聊天,她表示刚在boss上发布了一个普通测试岗位,不到一小时竟然收到了几百份简历。而且简历质量极高,这是往年不敢想象的。岗位少,竞争激烈,这是今年软件测试就业的真实写照,也是所有岗位…

网狐大联盟数据库迁移到Linux系统

1.系统要求: ubuntu 20.04 Ubuntu 20.04.6 LTS (Focal Fossa) 安装系统 2.linux上安装mssql server Linux 上的 SQL Server 概述 - SQL Server | Microsoft Learn 安装指令: # 安装mssql-serverwget -qO- https://packages.microsoft.com/keys/microsoft.asc | sudo tee…

路径规划算法:基于入侵杂草优化的路径规划算法- 附代码

路径规划算法:基于入侵杂草优化的路径规划算法- 附代码 文章目录 路径规划算法:基于入侵杂草优化的路径规划算法- 附代码1.算法原理1.1 环境设定1.2 约束条件1.3 适应度函数 2.算法结果3.MATLAB代码4.参考文献 摘要:本文主要介绍利用智能优化…

Java入门教程||Java 数据结构||Java 集合框架

Java 数据结构 Java 数据结构 Java工具包提供了强大的数据结构。在Java中的数据结构主要包括以下几种接口和类: 枚举(Enumeration)位集合(BitSet)向量(Vector)栈(Stack&#xff0…

安全测试常用 ADB 命令

ADB,全称 Android Debug Bridge,即 Android 调试桥,是一个对 Android 开发人员和测试人员都必不可少的工具。adb 包含在 Android SDK 平台工具软件包中。可以使用 SDK 管理器下载此软件包,该管理器会将其安装在 android_sdk/platf…

多线程和多进程

线程和进程 最近经常看到多线程和多进程,这两个概念在某些方向还是很像的,但是进程和线程到底有啥联系,又有啥区别,很多人并没有完全弄明白,最近学操作系统的时候,老师经常叫线程为进程的进程,…

CMake之安装打包

目录 安装公共选项安装目标安装文件安装目录安装导出 导出问题 安装 install的用法 公共选项 install有多个签名,这些签名公用的选项有以下: DESTINATION:指定文件要安装的目录,可以是相对路径或绝对路径。 相对路径&#xff…

【JVM】12. 垃圾回收相关概念

文章目录 12.1. System.gc()的理解12.2. 内存溢出与内存泄露内存溢出(OOM)内存泄漏(Memory Leak) 12.3. Stop The World12.4. 垃圾回收的并行与并发并发(Concurrent)并行(Parallel)并…

QT调用VS编译的RabbitMQ-C静态库

为此折腾两天,参考了不少大神的文章,再次标识感谢。把自己的一些思路简单记录下: https://blog.csdn.net/qq_70244454/article/details/128086920 https://blog.csdn.net/zjzytnn/article/details/70045247 把几个踩过的坑,记录…

【Python REST API】零基础也能轻松掌握的学习路线与参考资料

REST(Representational State Transfer)是一种基于HTTP协议的软件架构风格,用于构建分布式网络应用程序。Python是一种功能强大的编程语言,它具有丰富的库和框架,可以使用Python编写RESTful API。本篇文章将详细介绍Py…

[java安全]反射

文章目录 [java安全]反射定义反射的运用1、反射获取类对象1.1、Class.forName()1.2、Object.class1.3、obj.getClass() 2、反射获取成员方法2.1、getMethods()2.2、getDeclaredMethods()2.3、getMethod()2.4、getDeclaredMethod() 3、反射获取构造方法4、反射创建对象4.1、通过…

复习之Linux系统中的用户管理

1.用户及用户组的意义 在Linux中,用户(User)和用户组(Group)是管理系统权限和资源访问的重要概念。 (1)用户 用户是指系统中的一个身份标识,每个用户都有自己的用户名和密码。每个…

chatgpt赋能python:Python编程炒股软件:优秀的股票市场分析工具

Python 编程炒股软件:优秀的股票市场分析工具 Python 编程语言一直以来在数据分析和科学计算领域处于领先地位。由于它强大的数据处理能力和易于使用的编程语言特性,Python成为了许多股票市场分析工具的首选。 现在,越来越多的投资者使用Py…

RocketMQ 学习教程——(二)SpringBoot 集成 RocketMQ

文章目录 添加 RocketMQ 依赖消费者 ConsumerYAML 配置创建监听器消息过滤Tag 过滤 生产者 ProducerYAML 配置发送同步消息发送异步消息发送单向消息发送延迟消息发送顺序消息发送批量消息发送集合消息 添加 RocketMQ 依赖 在 Maven 仓库【https://mvnrepository.com/】中搜索 …

Latex在同一figure中排版多张图片的方法

Latex在同一figure中排版多张图片的方法 主要使用了minipage(子图)语法。minipage可以嵌套,子图还可以分解为更多子图,功能很好玩,无聊可以自己试试。下面介绍几种常用效果的实现方法。 并排显示两张图,并…

StarRocks 中的数据模型和索引使用

一、StarRocks 数据模型 StarRocks 支持四种数据模型,分别是明细模型 (Duplicate Key Model)、聚合模型 (Aggregate Key Model)、更新模型 (Unique Key Model) 和主键模型 (Primary Key Model)。 1.1 明细模型 明细模型是默认的建表模型。如果在建表时未指定任何…

chatgpt赋能python:Python自动截屏教程

Python 自动截屏教程 介绍 Python 是一种高级程序设计语言,已广泛用于各种应用中,从 Web 开发到机器学习都有很多案例。其中,Python 的截屏功能得到了越来越多的关注,因为在很多应用场景中,自动截屏可以帮助我们更有…

【JVM】11. 垃圾回收及回收算法算法

文章目录 11.1. 垃圾回收概述11.1.1. 什么是垃圾?什么是垃圾? 11.1.2. 为什么需要GC11.1.3. 早期垃圾回收11.1.4. Java垃圾回收机制担忧GC主要关注的区域 11.2. 垃圾回收相关算法11.2.1. 标记阶段:引用计数算法方式一:引用计数算法…

C++数据结构:散列表简单实现(hash表)

文章目录 前言一、设计思想二、实现步骤1、定义节点2、定义Hash表类 三、数据示例总结 前言 散列表是一种常用的数据结构,它可以快速地存储和查找数据。散列表的基本思想是,将数据的关键字映射到一个有限的地址空间中,然后在该地址空间中存储…

Nacos源码-从Demo出发研究事件驱动与观察者模式的应用

在我们分析 Nacos 源码时,会看见大量的事件发布的动作,不管是客户端注册/下线、服务改变、服务订阅等等都是利用了事件发布。 下面我在自己的项目中,引入Nacos的依赖进行一个简单的demo的演示,我个人认为其和spring容器的listene…