服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - MySql约束超详细介绍

MySql约束超详细介绍

2022-11-13 15:57在人间负债^ Mysql

MySQL唯一约束(Unique Key)是指所有记录中字段的值不能重复出现。例如,为 id 字段加上唯一性约束后,每条记录的 id 值都是唯一的,不能出现重复的情况

1. 什么是约束

约束对应的英语单词:constraint

在创建表的时候,我们可以给表中的字段加上一些约束,来保证表中的数据的完整性、有效性!!!

约束的作用就是为了保证:表中的数据有效!!

2. 约束包括哪些

非空约束 not null

唯一性约束 unique

主键约束 primary key

外键约束 foreign key

检查约束 check

3. 非空约束

非空约束 not null 约束的字段不能为 NULL

mysql> create table t_vip(id int, name varchar(255) not null);

MySql约束超详细介绍

mysql> insert into t_vip(id, name) values(1, "zhangsan");
mysql> insert into t_vip(id, name) values(2, "lisi");

MySql约束超详细介绍

mysql> insert into t_vip(id) values(3);
ERROR 1364 (HY000): Field "name" doesn"t have a default value

MySql约束超详细介绍

4. 唯一性约束

唯一性约束 unique 约束的字段不能重复,但是可以为 NULL

1. 单字段唯一性约束

mysql> create table t_vip(id int, name varchar(255) unique, email varchar(255));

MySql约束超详细介绍

mysql> insert into t_vip(id, name, email) values(3, "lisi", "lisi@123.com");
ERROR 1062 (23000): Duplicate entry "lisi" for key "t_vip.name"
mysql> select * from t_vip;

MySql约束超详细介绍

2. 多字段唯一性约束

需求:name 和 email 两个字段联合起来具有唯一性!!!

mysql> create table t_vip(id int, name varchar(255) unique, email varchar(255) unique);

这样创建的表是不符合上述需求的,因为 name 具有唯一性,email 具有唯一性。两个字段各自具有唯一性。

mysql> create table t_vip(id int, name varchar(255), email varchar(255), unique(name, email));
mysql> insert into t_vip(id, name, email) values(1, "zhangsan", "zhangsan@123.com");
mysql> insert into t_vip(id, name, email) values(1, "zhangsan", "zhangsan@sina.com");

MySql约束超详细介绍

5. 主键约束

主键约束 primary key 简称 pk

1. 主键约束的相关术语

  1. 主键约束:就是一种约束。
  2. 主键字段:该字段上添加了主键约束,这样的字段叫做:主键字段。
  3. 主键值:主键字段中的每一个值都叫做:主键值。

2. 什么是主键以及有啥用

主键值是每一行记录的唯一标识

主键值是每一行记录的身份证号!!!

记住:任何一张表都应该有主键,没有主键,表无效!!!

主键的特征:not null + unique(主键值不能是 NULL,同时也不能重复)

3. 单一主键

mysql> create table t_vip(id int primary key, name varchar(255));

MySql约束超详细介绍

主键不能重复

mysql> insert into t_vip(id, name) values(2, "lisi");
ERROR 1062 (23000): Duplicate entry "2" for key "t_vip.PRIMARY"

MySql约束超详细介绍

主键不能为NULL

mysql> insert into t_vip(name) values("lisi");
ERROR 1364 (HY000): Field "id" doesn"t have a default value

MySql约束超详细介绍

4. 复合主键

mysql> create table t_vip(id int, name varchar(255), email varchar(255), primary key(id, name));

MySql约束超详细介绍

mysql> insert into t_vip(id, name, email) values(1, "zhangsan", "zhansgan@123.com");
mysql> insert into t_vip(id, name, email) values(1, "lisi", "lisi@123.com");

MySql约束超详细介绍

5. 其他主键

除了单一主键和复合主键外,还拥有:

  • 自然主键:主键值是一个自然数,和业务没有关系。
  • 业务主键:主键值和业务紧密关联,例如拿银行卡账号做主键值。这就是业务主键!

实际开发中,使用自然主键多,很少使用业务主键!!!

主键一旦和业务值挂钩,可能会出现各种问题!!!

6. 外键约束

外键页数 foregin key 简称 fk

1. 外键约束的相关术语

  1. 外键约束:一种约束:foregin key。
  2. 外键字段:该字段上添加了外键约束。
  3. 外键值:外键字段当中的每一个值。

2. 外键出现的原因

业务背景:

请设计数据库表,来描述 “班级和学生” 的信息?

第一种方案:班级和学生存储在一张表中

MySql约束超详细介绍

分析上述方案的缺点:数据冗余,空间浪费!!!

第二种方案:班级一张表,学生一张表

MySql约束超详细介绍

MySql约束超详细介绍

当 cno 字段没有任何约束的时候,可能会导致数据无效。可能出现一个 102,但是 102 班级不存在,所以为了保证 cno 字段中的值都是 100 和 101,需要给 cno 字段添加外键约束。 那么:cno 字段就是外键字段。cno 字段中的每一个值都是外键值。

注意:

t_class 是父表 t_student 是字表

删除表的顺序?

先删子,再删父。

创建表的顺序?

先创建父,再创建子。

删除数据的顺序?

先删子,再删父。

插入数据的顺序?

先插入父,再插入子。

3. 创建外键表

创建表

mysql> create table t_class(classno int primary key, classname varchar(255));
mysql> create table t_student(no int primary key auto_increment, name varchar(255), cno int, foreign key(cno) references t_class(classno));

MySql约束超详细介绍

MySql约束超详细介绍

插入数据

mysql> insert into t_class(classno, classname) values(100, "北京市大兴区亦庄镇第二中学高三1班");
mysql> insert into t_class(classno, classname) values(101, "北京市大兴区亦庄镇第二中学高三2班");

MySql约束超详细介绍

mysql> insert into t_student(name, cno) values("jack", 100);
mysql> insert into t_student(name, cno) values("lucy", 100);
mysql> insert into t_student(name, cno) values("lilei", 100);
mysql> insert into t_student(name, cno) values("hanmeimei", 100);
mysql> insert into t_student(name, cno) values("zhangsan", 100);
mysql> insert into t_student(name, cno) values("lisi", 100);
mysql> insert into t_student(name, cno) values("wangwu", 100);
mysql> insert into t_student(name, cno) values("zhaoliu", 100);

MySql约束超详细介绍

注意:子表中的外键引用的父表中的某个字段,被引用的这个字段必须是主键吗?

不一定是主键,但至少具有 unique 约束。

到此这篇关于MySql约束超详细介绍的文章就介绍到这了,更多相关MySql约束内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文地址:https://blog.csdn.net/qq_52354698/article/details/126671092

延伸 · 阅读

精彩推荐
  • Mysqlmysql查询时offset过大影响性能的原因和优化详解

    mysql查询时offset过大影响性能的原因和优化详解

    这篇文章主要给大家介绍了关于mysql查询时offset过大影响性能的原因和优化的相关资料,并在文末跟大家分享了MYSQL中limit,offset的区别,需要的朋友可以参考...

    傲雪星枫6742019-07-09
  • MysqlMysql事务隔离级别原理实例解析

    Mysql事务隔离级别原理实例解析

    这篇文章主要介绍了Mysql事务隔离级别原理实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参...

    孤独烟4202021-01-12
  • Mysql聊聊MySQL事务的特性和隔离级别

    聊聊MySQL事务的特性和隔离级别

    这篇文章主要介绍了MySQL事务的特性和隔离级别的相关资料,帮助大家粗略的认识下MySQL 事务的相关知识,感兴趣的朋友可以了解下...

    张小云的博客5702021-02-02
  • Mysql为什么MySQL数据库索引选择使用B+树?

    为什么MySQL数据库索引选择使用B+树?

    今天小编就为大家分享一篇关于为什么MySQL数据库索引选择使用B+树?,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟...

    徐刘根2012020-09-13
  • MysqlMYSQL 随机 抽取实现方法及效率分析

    MYSQL 随机 抽取实现方法及效率分析

    MYSQL的随机抽取实现方法。举个例子,要从tablename表中随机提取一条记录,大家一般的写法就是:SELECT * FROM tablename ORDER BY RAND() LIMIT 1。 ...

    mysql教程网4102019-10-27
  • Mysqlmysql压力测试脚本实例

    mysql压力测试脚本实例

    这篇文章主要介绍了mysql压力测试脚本,实例展示了实现MySQL压力测试的完整方法,需要的朋友可以参考下 ...

    shichen20144412020-04-24
  • MysqlMySQL内部临时表的具体使用

    MySQL内部临时表的具体使用

    MySQL临时表在很多场景中都会用到,比如用户自己创建的临时表用于保存临时数据,以及MySQL内部在执行复杂SQL时,需要借助临时表进行分组、排序、去重等...

    Yungyu6402021-11-25
  • Mysql找到MySQL的优点

    找到MySQL的优点

    假设你是一个Access开发人员,而你想移植一个Access后台到一个本地的MySQL 服务器用于开发和测试。你将维护你自己的解决方案并乐于使用Community Server ...

    mysql教程网3922019-11-01