概述
1、【什么是约束】:
约束对应的英文是'constraint'。在创建表的时候,我们可以给表中的某些字段加上一些约束。来保证这个表中数据的完整性、有效性及合法性。
【约束的作用】:就是保证表中的数据有效!
2、【约束包括哪些】:
非空约束: not null 需要掌握
唯一性约束:unique 需要掌握
主键约束: primary key 需要掌握
外键约束: foreign key 需要掌握
检查约束: check(mysql不支持 Oracle支持)
3、【非空约束:not null】
非空约束not null约束的字段不能为null
例如:
drop table if exists t_vip; #如果存在表t_vip就删除。
create table t_vip( #创建表t_vip
id int, #字段名为id 类型为int
name varchar(255) not null #字段名为name,类型varchar,not null约束该字段不能为空
);
4、【唯一性约束:unique】
唯一性约束的字段不能重复,但是可以有多个null或者全是null。
drop table if exists t_vip; #如果存在表t_vip就删除。
create table t_vip( #创建表t_vip
id int, #字段名为id 类型为int
name varchar(255) unique #字段名为name,类型varchar, unique约束该字段不能重复
);
【name字段虽然被unique约束了,但是可以都为null。】
新需求:要求两个字段联合唯一(id和name联合唯一)
drop table if exists t_vip; #如果存在表t_vip就删除。
create table t_vip( #创建表t_vip
id int, #字段名为id 类型为int
name varchar(255), #字段名为name,类型varchar
email varchar unique, #字段名email,类型varchar,unique表示唯一性约束(列级约束)
unique(id,name) #表示id和name两个字段联合唯一 (表级约束)
);
【unique 和 not null 也可以联合使用】
drop table if exists t_vip; #如果存在表t_vip就删除。
create table t_vip( #创建表t_vip
id int, #字段名为id 类型为int
name varchar(255) not null unique #表示name字段不能为空,也不能重复.name自动成为主键
);
注意:在mysql中,如果一个字段被not null和unique同时约束,该字段自动变成主键字段.(oracle中不一样)也可以直接进行主键约束primary key。
5、主键约束:
相关术语:
主键约束:primary key
主键字段:添加了主键约束的字段叫做主键字段
主键值:主键字段中的每一个值都叫主键值
主键作用:
主键值是每一行记录的唯一标识,是每一行记录的身份证。
【记住:任何一张表都应该有主键,没有主键,表无效!】
【主键的特征:不能为空,也不能重复】
主键的分类
* 根据字段数量划分
- 单一主键 (推荐使用)
- 复合主键 (不推荐使用)
* 根据主键性质划分
- 自然主键 主键值是一个自然数,和业务没有关系。(推荐使用)
- 业务主键 主键值和业务紧密关联,例如拿银行卡账号做主键值,这就是业务主键。(不推荐使用)
添加主键约束:(一个字段做主键叫做单一主键)
drop table if exists t_vip; #如果存在表t_vip就删除。
create table t_vip( #创建表t_vip
id int primary key, #对id字段添加了主键约束,id字段成为了主键字段(列级约束)
name varchar(255)
);
还可以这样添加主键约束:
drop table if exists t_vip; #如果存在表t_vip就删除。
create table t_vip( #创建表t_vip
id int, #字段名为id 类型为int
name varchar(255),
primary key(id) #这样添加主键约束也是可以的 (表级约束)
);
多个字段联合做主键叫做复合主键。
drop table if exists t_vip; #如果存在表t_vip就删除。
create table t_vip( #创建表t_vip
id int, #字段名为id 类型为int
name varchar(255),
primary key(id,name) #两个字段联合做主键称为复合主键 (表级约束)
);
结论:一张表主键约束只能添加一个。(也就是主键只能有一个)
主键值建议使用:int、bigint、char等类型.不建议使用varchar做主键.主键值一般都是数字定长的.
在实际开发中自然主键使用较多,因为主键只要做到不重复就行,不需要有意义。业务主键不好,因为主键一旦和业务挂钩,那么当业务发生变动的时候,可能会影响到主键值,所以不建议使用业务主键,尽量使用自然主键。
在mysql中,有一种机制,可以帮助我们自动维护一个主键值:(auto_increment自增,从1开始,以1递增)
举例:
drop table if exists t_vip; #删除表
create table t_vip(
id int primary key auto_increment, #id做主键,并且自增(新增记录时只写name,id会自动添加)
name varchar(255)
);
添加记录:
insert into t_vip(name) values ('zhangsan');
insert into t_vip(name) values ('lisi');
insert into t_vip(name) values ('wangwu');
insert into t_vip(name) values ('zhaoliu');
insert into t_vip(name) values ('xiaohua'); #会自动添加主键值1、2、3、4、5
6、外键约束:(foreign key,简称FK)(非常重要 五颗星 *****)
相关术语:
外键约束:一种约束(foreign key)
外键字段:该字段上添加了外键约束
外键值:外键字段当中的每一个值
相关知识扩展:
表文件字段分类:主键字段、非主键字段、外键字段
主键字段:用于存放主键编号的字段,每张表都应该存在一个主键字段。主键编号相当于身份证编号,用于对表文件中数据行身份进行确认,主键字段既不能为null也不能重复。
非主键字段:用来描述主键字段
外键字段:外键字段只存在于【多方表】中,描述多方数据与一方数据之间的依赖关系。外键字段的值应该来源于一方表中的某个字段的值。但是可以存储null值。
举例:
业务需求:设计数据库表,来描述“班级和学生”的信息
第一种方案:信息存储在一张表中
no(PK) name classno classname
-------------------------------------------------------------------------------
1 jack 101 秦皇岛市第二中学高三1班
2 make 101 秦皇岛市第二中学高三1班
3 mali 101 秦皇岛市第二中学高三1班
4 lisi 102 秦皇岛市第二中学高三2班
5 lili 102 秦皇岛市第二中学高三2班
6 lima 102 秦皇岛市第二中学高三2班
分析上面这张表:数据冗余,空间浪费,设计失败!
第二种方案:班级一张表、学生一张表
t_class 班级表
classno(PK) classname
------------------------------------------------------------
101 秦皇岛市第二中学高三1班
102 秦皇岛市第二中学高三2班
t_student 学生表
no(PK) name cno(班级编号)
------------------------------------------------------------------
1 jack 101
2 make 101
3 mali 101
4 lisi 102
5 lili 102
6 lima 102
当cno字段没有任何约束的时候,可能会出现一个100这样的无效数据,因为100班级不存在,所以为了保证cno字段中的值不出现无效数据,需要给cno字段添加外键约束。这样cno字段就是外键字段,cno字段中的每一个值都是外键值。
注意:t_class是父表 t_student是子表
创建表的顺序:先创建父表,再创建子表。
删除表的顺序:先删除子表,再删除父表。
插入数据的顺序:先插入父表数据,再插入子表数据。
删除数据的顺序:先删除子表数据,再删除父表数据。
编写sql语句创建t_class 班级表和t_student 学生表:
drop table if exists t_student; #如果存在表t_student就删除(先删子)
drop table if exists t_class; #如果存在表t_class就删除 (后删父)
create table t_class( #创建表t_class (先建父)
classno int primary key, #classno字段数据类型为int 并设置为主键
classname varchar(255) #classname字段数据类型为varchar长度255
);
create table t_student( #创建表t_student (后建子)
no int primary key auto_increment, #no字段数据类型为int 并设置为主键 且自增。
name varchar(255), #name字段数据类型为varchar长度255
cno int, #cno字段数据类型应该与classno保持一致都是int
foreign key(cno) references t_class(classno) #cno字段设置外键约束,引用t_class表的classno
);
向表t_class中添加记录:
insert into t_class(classno,classname) values(101,'北京大兴区蚂蚁庄第二中学高三1班');
insert into t_class(classno,classname) values(102,'北京大兴区蚂蚁庄第二中学高三2班');
向表t_student中添加记录:
insert into t_student(name,cno) values('jack',101); #因为no字段是自增的,可以不写
insert into t_student(name,cno) values('make',101);
insert into t_student(name,cno) values('mali',101);
insert into t_student(name,cno) values('lisi',102);
insert into t_student(name,cno) values('lili',102);
insert into t_student(name,cno) values('lima',102);
思考:子表中的外键引用的父表中的某个字段,被引用的这个字段必须是主键吗?
答:不一定是主键,但是必须具有unique约束,也就是唯一性约束。
外键值也可以为null。
最后
以上就是成就冷风为你收集整理的约束(constraint)的全部内容,希望文章能够帮你解决约束(constraint)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复