MySQL约束
2021/9/23 2:12:42
本文主要是介绍MySQL约束,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
什么是约束?
约束对应的英语单词:constraint
在创建表的时候,可以给表中的字段加上一些约束,来保证这个表中数据的完整性、有效性
约束的作用就是为了保证表中的数据有效
约束包括哪些?
非空约束:not null
唯一性约束:unique
主键约束:primary key(简称PK)
外键约束:foreign key(简称FK)
检查约束:check(mysql不支持,oracle支持)
非空约束 not null
非空约束not null 约束的字段不能为null
create table t_vip( id int, name varchar(255) not null ); insert into t_vip(id,name) values(1,'张三'); insert into t_vip(id,name) values (2,'李四'); insert into t_vip(id,name) values (3); #报错,设有not null 的字段不能为空,必须插入数据
not null只有列级约束,没有表级约束
唯一性约束:unique
唯一性约束unique约束的字段不能重复,但是可以为null
drop table if exists t_vip; create table t_vip( id int, name varchar(255) unique, email varchar(255) ); insert into t_vip(id,name,email) values (1,'张三','zhangsan@qq.com'); insert into t_vip(id,name,email) values (2,'李四','lisi@qq.com'); insert into t_vip(id,name,email) values (3,'王五','wangwu@123.com'); select * from t_vip; insert into t_vip(id,name,email) values (4,'王五','wangwu@996.com'); #报错,字段有unique约束,具有唯一性,不能重复 insert into t_vip(id) values(5); insert into t_vip(id) values(6); #虽然被unique约束了,但是可以为null
两个字段联合起来具有唯一性
drop table if exists t_vip; #约束添加在列的后面,这种约束被称为列级约束 #约束没有添加在列的后面,这种约束被称为表级约束 create table t_vip( id int, name varchar(255), email varchar(255), unique(name,email) #两个字段联合起来唯一 ); insert into t_vip(id,name,email) values (1,'zhangsan','zhangsan@123.com'); insert into t_vip(id,name,email) values (2,'zhangsan','zhangsan@sina.com'); select * from t_vip; insert into t_vip(id,name,email) values (3,'zhangsan','zhangsan@sina.com'); #报错, Duplicate entry 'zhangsan-zhangsan@sina.com' for key 't_vip.name'
什么时候使用表级约束?
需要给多个字段联合起来添加某一个约束的时候,需要使用表级约束
unique和notnull可以联合使用
drop table if exists t_vip; create table t_vip( id int, name varchar(255) not null unique ); insert into t_vip(id,name) values (1,'zhangsan'); insert into t_vip(id,name) values (2,'zhangsan'); #错误,unique约束 insert into t_vip(id) values (3); #错误,not null约束
在MySQL当中,如果一个字段同时被not null 和 unique约束的话,该字段会自动变成主键
主键约束(primary key,简称PK)
主键约束的相关术语:
- 主键约束:就是一种约束
- 主键字段:该字段上添加了主键约束,这样的字段叫做:主键字段
- 主键值:主键字段中的每一个值叫做:主键值
什么是主键?有啥用?
主键值是每一个记录的唯一标识
主键值是每一行记录的身份证号
任何一张表都应该有主键,没有主键,表无效
主键的特征:not null + unique(主键值不能是null,同时也不能重复)
给一张表添加主键约束
drop table if exists t_vip; create table t_vip( #一个字段做主键叫做:单一主键 id int primary key, #列级约束 name varchar(255) ); insert into t_vip(id,name) values (1,'zhangsan'); insert into t_vip(id,name) values (2,'lisi'); #错误,主键不能重复 insert into t_vip(id,name) values (2,'wangwu'); select * from t_vip; insert into t_vip(name) values ('zhaoliu'); #错误,主键不能为空 #主键可以使用表级约束 create table t_vip( id int, name varchar(255), primary key(id) #表级约束 ); insert into t_vip(id,name) values (1,'zhangsan'); insert into t_vip(id,name) values (2,'lisi'); #错误:重复 insert into t_vip(id,name) values (2,'wangwu'); #表级约束主要是给多个字段联合起来添加约束 create table t_vip( #id和name联合起来做主键:复合主键 id int, name varchar(255), email varchar(255), primary key(id,name) ); insert into t_vip(id,name,email) values (1,'zhangsan','zhangsan@123.com'); insert into t_vip(id,name,email) values (1,'lisi','lisi@123.com'); select * from t_vip; #错误:不能重复 insert into t_vip(id,name,emali) values (1,'zhangsan','abc@123.com'); #错误: Multiple primary key defined 一张表,主键约束只能添加一个 create table t_vip( id int primary key, name varchar(255) primary key );
主键值建议使用:
- int
- bigint
- char
- 等类型
不建议使用:varchar来做主键,主键值一般都是数字,一般都是定长的
主键:除了单一主键和复合主键之外,还可以这样进行分类
- 自然主键:主键值是一个自然数,和业务没关系
- 业务主键:主键值和业务紧密关联,例如拿银行卡账号做主键值,这就是业务主键
实际开发中自然主键使用比较多,因为主键只要做到不重复就行,不需要有意义
业务主键不好,因为主键一旦与业务挂钩,那么当业务发生变动的时候,可能会影响
到主键值,所以业务主键不建议使用,尽量使用自然主键
#mysql中,有一种机制,可以帮助自动维护一个主键值 create table t_vip( id int primary key auto_increment, name varchar(255) ); insert into t_vip(name) values ('张三'); insert into t_vip(name) values ('张三'); insert into t_vip(name) values ('张三'); insert into t_vip(name) values ('张三'); insert into t_vip(name) values ('张三'); insert into t_vip(name) values ('张三'); insert into t_vip(name) values ('张三'); select * from t_vip;
外键约束(foreign key,简称FK)
外键约束涉及到的相关术语:
- 外键约束:一种约束(foreign key)
- 外键字段:该字段上添加外键约束
- 外键值:外键字段当中的每一个值
子表和父表之间的顺序
删除表的顺序
- 先删子,再删父
创建表的顺序
- 先创建父,再创建子
删除数据的顺序
- 先删子,再删父
插入数据的顺序
- 先插入父,再插入子
思考:子表中的外键引用的父表中的某个字段,被引用的这个字段必须是主键吗?
不一定是主键,但至少具有unique约束
设计一张数据库表,来描述"班级和学生"信息
drop table if exists t_student; drop table if exists t_class; #请设计一张数据库表,来描述"班级和学生"的信息 create table t_class( classno int primary key, classname varchar(255) ); create table t_student( no int primary key auto_increment, name varchar(255), cno int, foreign key(cno) references t_class(classno) #外键约束 ); insert into t_class(classno,classname) values (110,'麻省理工软件与信息工程学院1班'); insert into t_class(classno,classname) values (111,'麻省理工软件与信息工程学院2班'); insert into t_student(name,cno) values ('Jack',110); insert into t_student(name,cno) values ('Marry',110); insert into t_student(name,cno) values ('Lucy',110); insert into t_student(name,cno) values ('Cedric',110); insert into t_student(name,cno) values ('zhangsan',110); insert into t_student(name,cno) values ('lisi',111); insert into t_student(name,cno) values ('wangwu',111); insert into t_student(name,cno) values ('zhaoliu',111); insert into t_student(name,cno) values ('Smith',111); select * from t_class; select * from t_student; #外键字段可以为null insert into t_student(name) values ('qiqi');
这篇关于MySQL约束的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-12-25如何部署MySQL集群资料:新手入门教程
- 2024-12-24MySQL集群部署资料:新手入门教程
- 2024-12-24MySQL集群资料详解:新手入门教程
- 2024-12-24MySQL集群部署入门教程
- 2024-12-24部署MySQL集群学习:新手入门教程
- 2024-12-24部署MySQL集群入门:一步一步搭建指南
- 2024-12-07MySQL读写分离入门:轻松掌握数据库读写分离技术
- 2024-12-07MySQL读写分离入门教程
- 2024-12-07MySQL分库分表入门详解
- 2024-12-07MySQL分库分表入门指南