news 2026/4/1 14:48:15

【赵渝强老师】MySQL的数据约束

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【赵渝强老师】MySQL的数据约束

在数据库中,“约束”指的是对表中数据的一种限制条件,它能够确保数据库中数据的准确性和有效性。比如有的数据是必填项,就像身份认证的时候,或者填注册信息的时候,手机号身份证这种就不能空着,所以就有了非空约束;又有的数据比如用户的身份证号码不能跟其他人的一样,所以就需要使用唯一约束等等。在MySQL中主要有6种约束:主键约束、外键约束、唯一约束、检查约束、非空约束和默认值约束。

视频讲解如下

【赵渝强老师】MySQL的数据约束

一、 主键约束(primary key)

主键是表里面的一个特殊字段,这个字段能够唯一标识该表中的每条信息。一张表只能定义一个主键,如果一个字段被定义成了主键,该列的值不允许为NULL,也不允许重复。下面是一个示例。

(1)创建表testprimarykey,并为表设置主键约束。

mysql>createtabletestprimarykey(idintprimarykey,namevarchar(20));# 提示:主键约束也可以在多个列上设定,例如:mysql>createtabletestprimarykey(idint,namevarchar(20),gendervarchar(10),primarykey(id,name));# 如果要在已经存在的表上添加主键约束,可以使用下面的语句:mysql>altertabletestprimarykeyaddprimarykey(id,name);

(2)往testprimarykey表中插入数据。

mysql>insertintotestprimarykeyvalues(1,'Tom');mysql>insertintotestprimarykeyvalues(2,'Mary');mysql>insertintotestprimarykeyvalues(1,'Mike');# 提示:当插入第3条数据时,会出现下面的错误。因为主键不允许重复。ERROR1062(23000):Duplicateentry'1'forkey'testprimarykey.PRIMARY'

二、 外键约束(foreign key)

外键通常会和主键约束一起使用,用来确保数据的一致性。对于有关联关系的两张表,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表),外键就是用来建立主表与从表的关联关系。当子表的某一个字段被定义为外键时,该列上的值必须在父表中存在或者为NULL值。下面是一个示例。
(1)创建用于外键约束的父表和子表。

mysql>createtabletestparent(idintprimarykey,namevarchar(20));mysql>createtabletestchild(idint,namevarchar(20),classes_idint,foreignkey(classes_id)referencestestparent(id));# 提示:外键也可以使用多个字段组合进行设置,例如:mysql>createtableclasses(idint,namevarchar(20),numberint,primarykey(id,name));mysql>createtablestudent(idintauto_incrementprimarykey,namevarchar(20),classes_idint,classes_namevarchar(20),foreignkey(classes_id,classes_name)referencesclasses(id,name));# 如果要在已存在的表上添加外键约束,可以使用下面的语句:mysql>altertablestudentaddforeignkey(classes_id,classes_name)referencesclasses(id,name);

(2)往表testparent和表testchild中插入数据。

mysql>insertintotestparentvalues(1,'Dev');mysql>insertintotestchildvalues(1,'Tom',1);mysql>insertintotestchildvalues(2,'Mike',1);# 提示: 这三条insert语句都将成功插入数据。

(3)往表testchild中插入一条错误的数据。

mysql>insertintotestchildvalues(3,'Mary',2);# 由于在表testparent中不存在“2”号记录,因此将输出下面的错误信息:ERROR1452(23000): Cannotaddorupdatea childrow: aforeignkeyconstraintfails(`demo1`.`testchild`,CONSTRAINT`testchild_ibfk_1`FOREIGNKEY(`classes_id`)REFERENCES`testparent`(`id`))

三、 唯一约束(unique)

唯一约束就是指所有记录中字段的值不允许重复。值得注意的时,由于SQL中的NULL值是一个特殊值,因此如果一个字段被定义了唯一约束,该字段的值允许为NULL。下面是一个示例。

(1)创建新的表,并设置用户名、密码不能重复。

mysql>createtabletestunique(idintnotnull,namevarchar(20),passwordvarchar(10),unique(name,password));# 提示:如果想要在已经存在的表上添加唯一约束,可以使用下面的语句:mysql>mysql>altertabletestuniqueaddunique(name,password);

(2)往表testunique中插入数据。

mysql>insertintotestuniquevalues(1,'Tom','123456');mysql>insertintotestuniquevalues(2,'Mary','123456');mysql>insertintotestuniquevalues(3,'Mary','123456');# 当插入第三条数据的时候,会出现下面的错误信息:ERROR1062(23000):Duplicateentry'Mary-123456'forkey'testunique.name'

四、 检查约束(check)

MySQL提供了检查约束用来指定某列的可取值的范围,它通过限制输入到列中的值来强制域的完整性。下面是一个示例。
(1)创建新表,并添加检查约束用于检查薪水的范围。

mysql>createtabletestcheck(idintprimarykey,namevarchar(25),salaryfloat,check(salary>0andsalary<10000));

(2)往表testcheck中插入数据

mysql>insertintotestcheckvalues(1,'Tom',9000);mysql>insertintotestcheckvalues(2,'Mike',15000);# 当插入第二条数据的时候,会出现下面的错误信息:ERROR3819(HY000):Checkconstraint'testcheck_chk_1'isviolated.

五、 非空约束(not null)

非空约束用于确保该字段的值不能为空值,非空约束只能出现在表对象的列上。下面是一个示例。
(1)创建新表,并设定name为非空约束,且默认值为“no name”

mysql>createtabletestnotnull(idintnotnull,namevarchar(20)notnulldefault'no name',genderchar);

(2)往表testnotnull中插入数据。

mysql>insertintotestnotnullvalues(1,'Tom','F');mysql>insertintotestnotnull(id)values(2);# 提示:这两条语句都可以成功执行。# 尽管在第二条语句中没有给出name的值,在这种情况下将会采用默认值“no name”。

(3)查询表testnotnull中的数据。

mysql>select*fromtestnotnull;# 输出的信息如下:+----+---------+--------+|id|name|gender|+----+---------+--------+|1|Tom|F||2|noname|NULL|+----+---------+--------+

六、 默认值约束(default)

MySQL默认值约束用来指定某列的默认值。下面是一个示例。
(1)创建一张新的表test5.

mysql>createtabletest5(idint,namevarchar(32),ageint);

(2)在表中增加一个字段

mysql>altertabletest5addgendervarchar(10)default'Female';# 提示:这里增加了一个gender字段用于表示性别,默认是“Female”。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/30 17:52:02

网络安全建设基石:核心概念与关键规范标准一文厘清

网络安全概念及规范 1.网络安全定义 网络安全的概述和发展历史 网络安全 广义的网络安全&#xff1a;Cyber Security&#xff08;网络空间安全&#xff09; 网络空间有独立且相互依存的信息基础设施和网络组成&#xff0c;包括互联网、电信网、计算机系统、嵌入式处理器和控制…

作者头像 李华
网站建设 2026/3/25 18:55:08

用 Python 轻松剖析 GPU 性能:NVIDIA nsight-python 包来帮忙!

用 Python 轻松剖析 GPU 性能&#xff1a;NVIDIA nsight-python 包来帮忙&#xff01; 大家好&#xff01;如果你在用 PyTorch、TensorFlow 或其他框架训练 AI 模型&#xff0c;常会遇到“GPU 利用率低”“内核跑得慢”的问题&#xff0c;却不知道瓶颈在哪里&#xff1f;这时候…

作者头像 李华
网站建设 2026/3/31 20:34:59

Git Commit规范指南:助力你在TensorFlow开源社区贡献代码

Git Commit规范指南&#xff1a;助力你在TensorFlow开源社区贡献代码 在深度学习领域&#xff0c;成为 TensorFlow 的代码贡献者是许多工程师的职业目标之一。然而&#xff0c;真正进入这个全球顶级开源项目&#xff0c;并非只是写出正确的模型或修复一个 bug 就能实现。你提交…

作者头像 李华
网站建设 2026/3/27 11:08:22

JAVA游戏陪玩系统:打手护航,轻松上分

JAVA游戏陪玩系统通过高并发架构、智能匹配算法、实时通信技术及全链路安全防护&#xff0c;为玩家提供“打手护航&#xff0c;轻松上分”的竞技体验&#xff0c;其核心优势体现在以下方面&#xff1a;一、高并发架构&#xff1a;支撑百万级用户规模分布式微服务架构&#xff1…

作者头像 李华
网站建设 2026/3/6 10:23:07

GitHub Wiki构建TensorFlow项目文档知识库

GitHub Wiki 构建 TensorFlow 项目文档知识库 在深度学习项目日益复杂的今天&#xff0c;团队协作中最常遇到的问题往往不是模型结构本身&#xff0c;而是“为什么你的代码在我机器上跑不起来&#xff1f;”——这种环境差异引发的连锁反应&#xff0c;轻则浪费数小时排查依赖冲…

作者头像 李华