news 2026/4/16 12:32:12

【赵渝强老师】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/4/14 19:49:51

C++26静态反射即将落地:提前掌握这7种典型应用场景,抢占技术先机

第一章&#xff1a;C26静态反射核心机制解析 C26引入的静态反射机制标志着元编程能力的一次重大飞跃。该特性允许在编译期直接查询和遍历类型的结构信息&#xff0c;如成员变量、函数签名及属性&#xff0c;而无需依赖宏或模板特化等传统技巧。 静态反射的基本语法 通过关键字…

作者头像 李华
网站建设 2026/4/16 11:14:31

《2025 数字孪生白皮书》:智能算法落地实战指南,附技术实现细节

作为技术开发者&#xff0c;你是否在数字孪生项目中遇到过这些痛点&#xff1f;多源数据处理混乱、大规模模型渲染卡顿、机理与数据模型协同难、业务场景落地无抓手&#xff1f;由易知微牵头编制的《2025 数字孪生与智能算法白皮书》&#xff0c;从技术底层到行业实践给出了完整…

作者头像 李华
网站建设 2026/4/16 11:03:14

transformer模型详解之位置编码:TensorFlow代码实现

Transformer模型详解之位置编码&#xff1a;TensorFlow代码实现 在自然语言处理领域&#xff0c;当研究人员第一次尝试用纯注意力机制替代传统的RNN结构时&#xff0c;一个看似简单却极为关键的问题浮现出来&#xff1a;如何让模型知道“顺序”&#xff1f; 毕竟&#xff0c;句…

作者头像 李华
网站建设 2026/4/16 11:12:06

技术博客SEO优化:提高TensorFlow相关内容排名

技术博客SEO优化&#xff1a;提高TensorFlow相关内容排名 在人工智能内容创作的赛道上&#xff0c;一个有趣的现象正在发生&#xff1a;那些被搜索引擎优先推荐的技术文章&#xff0c;往往不是理论最深奥的&#xff0c;而是最“即查即用”的——读者一搜关键词&#xff0c;立刻…

作者头像 李华
网站建设 2026/4/15 11:07:56

HTML5 Canvas动态展示TensorFlow训练过程曲线

HTML5 Canvas动态展示TensorFlow训练过程曲线 在深度学习模型的开发过程中&#xff0c;开发者最常面对的一个问题就是&#xff1a;“我的模型到底收敛了吗&#xff1f;” 传统做法是打印每轮训练的损失值和准确率&#xff0c;然后靠肉眼观察数字变化趋势。但这种方式不仅低效&a…

作者头像 李华
网站建设 2026/4/10 7:03:42

简单理解: __FUNCTION__ 是什么?

1. 什么是 __FUNCTION____FUNCTION__ 是 C/C 编译器提供的预定义宏&#xff08;也叫内置宏&#xff09;&#xff0c;它会在编译阶段被自动替换为当前函数的名称&#xff08;字符串形式&#xff09;。简单来说&#xff0c;它就是一个 “函数名标签”&#xff0c;能让程序在运行时…

作者头像 李华