news 2026/6/15 14:26:47

【赵渝强老师】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/6/14 21:05:41

2025年10款开源大模型UI界面,小白也能轻松本地部署

文章精选10款开源大模型UI工具&#xff0c;解决API密钥外泄、数据隐私问题。从Open WebUI企业级部署到Streamlit极简开发&#xff0c;覆盖聊天、写稿、Agent构建等场景。支持本地化部署、多模型切换、RAG功能&#xff0c;适合不同技术背景用户快速搭建大模型应用&#xff0c;文…

作者头像 李华
网站建设 2026/6/10 17:19:43

Conda环境克隆快速复制TensorFlow开发配置

Conda环境克隆快速复制TensorFlow开发配置 在深度学习项目中&#xff0c;最让人头疼的往往不是模型调参&#xff0c;而是“为什么你的代码在我机器上跑不通”。这种经典的“在我这儿没问题”困境&#xff0c;背后其实是开发环境不一致惹的祸。尤其当团队协作、跨设备部署或复现…

作者头像 李华
网站建设 2026/6/10 22:33:45

为什么你的量子模拟器慢?90%程序员忽略的C++内存布局细节

第一章&#xff1a;为什么你的量子模拟器慢&#xff1f;90%程序员忽略的C内存布局细节在高性能计算场景中&#xff0c;量子模拟器的性能瓶颈往往不在于算法复杂度&#xff0c;而隐藏在底层的内存访问模式中。C对象的内存布局直接影响缓存命中率&#xff0c;而90%的开发者未意识…

作者头像 李华
网站建设 2026/6/10 18:09:20

网络安全竞赛全景盘点:从国内到国际,这些赛事值得关注

从零开始学CTF&#xff1a;网络安全竞赛完全指南&#xff0c;建议收藏学习 文章全面介绍网络安全竞赛&#xff0c;重点解析CTF比赛的概念、规则和五大类别&#xff08;Web安全、逆向工程、二进制安全、密码学和隐写术&#xff09;&#xff0c;并对比了CTF比赛、信息安全比赛和…

作者头像 李华