MySQL之senior(八)——约束
2021/10/22 2:10:26
本文主要是介绍MySQL之senior(八)——约束,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
MySQL之senior(八)——约束
not null 与 unique
-
定义:
约束对应的英语单词:constraint 在创建表的时候,我们可以给表中的字段加上一些约束,来保证这个表中数据的完整性、有效性
-
约束包括哪些? 非空约束:not null 只有列级约束,没有表级约束! 唯一性约束: unique unique约束的字段不能重复,但是可以为NULL。 主键约束: primary key (简称PK) 外键约束:foreign key(简称FK) 检查约束:check(mysql不支持,oracle支持) 注意:
-
约束直接添加到列后面的,叫做列级约束
-
约束没有添加在列的后面,这种约束被称为表级约束。
-
unique:有列级约束,有表级约束
-
primary key: 有列级约束(推荐),有表级约束
-
需要给多个字段联合起来添加某一个约束的时候,需要使用表级约束。
-
在mysql当中,一个字段同时被not null和unique约束,该字段自动变成主键字段。(oracle不是)
-
主键约束: primary key (PK)
-
主键: 主键值是每一行记录的唯一标识。 主键值是每一行记录的身份证号 任何一张表都应该有主键,没有主键,表无效!! 主键的特征:not null + unique(主键值不能是NULL,同时也不能重复!)
-
列级约束与表级约束
create table t_vip( id int primary key, # 列级约束 name varchar(255), ); create table t_vip( id int, name varchar(255), primary key(id) # 表级约束 );
-
单一主键与复合主键
create table t_vip( id int, name varchar(255), primary key(id) # 表级约束 单一主键 ); create table t_vip( id int, name varchar(255), email varchar(255), primary key(id,name) # 复合主键 ); # 在实际开发中不建议使用:复合主键。建议使用单一主键! # 因为主键值存在的意义就是这行记录的身份证号,只要意义达到即可,单一主键可以做到。 # 复合主键比较复杂,不建议使用 # 一张表,主键约束只能添加1个。
-
冷知识
主键除了:单一主键和复合主键之外,还可以这样进行分类? 自然主键:主键值是一个自然数,和业务没关系。 业务主键:主键值和业务紧密关联,例如拿银行卡账号做主键值。这就是业务主键! 在实际开发中使用业务主键多,还是使用自然主键多一些? 自然主键使用比较多,因为主键只要做到不重复就行,不需要有意义。 业务主键不好,因为主键一旦和业务挂钩,那么当业务发生变动的时候, 可能会影响到主键值,所以业务主键不建议使用。尽量使用自然主键。 在mysql当中,有一种机制,可以帮助我们自动维护一个主键值? create table t_vip( id int primary key auto_increment, //auto_increment表示自增,从1开始,以1递增! name varchar(255) );
外键约束:foreign key(FK)
t_class 班级表
classno(pk) | classname |
---|---|
101 | 北京市大兴区亦庄镇第二中学高三1班 |
102 | 北京市大兴区亦庄镇第二中学高三2班 |
t_student 学生表
no(pk) | name | cno(FK引用t_class这张表的classno) |
---|---|---|
1 | lucy | 100 |
2 | lilei | 101 |
3 | hanme | 100 |
4 | lile | 100 |
5 | zhansan | 101 |
6 | lisi | 100 |
7 | wangwu | 101 |
8 | zhaoliu | 101 |
当cno字段没有任何约束的时候,可能会导致数据无效。可能出现一个102,但是102班级不存在。 所以为了保证cno字段中的值都是100和101,需要给cno字段添加外键约束。 那么:cno字段就是外键字段。cno字段中的每一个值都是外键值。
注意:
t_class是父表 t_student是子表 删除表的顺序? 先删子,再删父。 创建表的顺序? 先创建父,再创建子。 删除数据的顺序? 先删子,再删父。 插入数据的顺序? 先插入父,再插入子。 create table t_student( no int primary key auto_increment, name varchar(255), cno int, foreign key(cno) references t_class(classno) ); 思考:子表中的外键引用的父表中的某个字段,被引用的这个字段必须是主键吗? 不一定是主键,但至少具有unique约束。 外键值可以为NULL。
这篇关于MySQL之senior(八)——约束的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-02MySQL集群项目实战:新手入门指南
- 2024-11-02初学者指南:部署MySQL集群资料
- 2024-11-01部署MySQL集群教程:新手入门指南
- 2024-11-01如何部署MySQL集群:新手入门教程
- 2024-11-01部署MySQL集群学习:新手入门教程
- 2024-11-01部署MySQL集群入门:新手必读指南
- 2024-10-23BinLog入门:新手必读的MySQL二进制日志指南
- 2024-10-23Binlog入门:MySQL数据库的日志管理指南
- 2024-10-22MySQL数据库入门教程:从安装到基本操作
- 2024-10-22MySQL读写分离入门教程:轻松实现数据库性能提升