1.约束种类
a)非空约束,not null
b)唯一约束,unique
c)主键约束,primary key
d)外键约束,foreign key
e)自定义检查约束,check(不建议使用)(在mysql中现在还不支持)
2.非空约束,not null——针对某个字段,设置其值不为空
- 设置表t_student中的name字段不为空
-
create table t_stu( no int(10), name varchar(20) not null, sex char(2) default 'm' );
-
insert into t_stu(no,sex) values (20,'f');
3.唯一约束,unique——它可以使某个字段的值不能重复
3.1.列级约束
-
drop table if exists t_stu; create table t_stu( no int(10) unique, //不可重复 class varchar(10), name varchar(20) not null, sex char(2) default 'm' );
-
insert into t_stu(no,class,name,sex) values (20,'senior','zs','f');
-
insert into t_stu(no,class,name,sex) values (20,'junior','ww','f'); //报错,字段no的值不可重复
3.2.表级约束(比列级约束要低级)
-
drop table if exists t_stu; create table t_stu( no int(10) , class varchar(10), name varchar(20) not null, sex char(2) default 'm', unique(no,class) );
-
insert into t_stu(no,class,name,sex) values (20,'senior','zs','f');
-
insert into t_stu(no,class,name,sex) values (20,'junior','zs','f');
4.主键约束,primary key——既不能为空,也不能重复
- 每个表应该具有主键,主键可以标识记录的唯一性。一张表的主键约束只能有1个。(必须记住)
- 主键分为单一主键和复合(联合)主键,单一主键是由一个字段构成的,复合(联合)主键是由多个字段构成的。
4.0.主键相关的术语?
主键约束 : primary key
主键字段 : id字段添加primary key之后,id叫做主键字段
主键值 : id字段中的每一个值都是主键值。
4.0.1.主键有什么作用?
- 表的设计三范式中有要求,第一范式就要求任何一张表都应该有主键。
- 主键的作用:主键值是这行记录在这张表当中的唯一标识。(就像一个人的身份证号码一样。)
4.0.2. 主键的分类?
- 根据主键字段的字段数量来划分:
- 单一主键(推荐的,常用的。)
- 复合主键(多个字段联合起来添加一个主键约束)(复合主键不建议使用,因为复合主键违背三范式。)
- 根据主键性质来划分:
- 自然主键:主键值最好就是一个和业务没有任何关系的自然数。(这种方式是推荐的)
- 业务主键:主键值和系统的业务挂钩,例如:拿着银行卡的卡号做主键,拿着身份证号码作为主键。(不推荐用)
- 注意:最好不要拿着和业务挂钩的字段作为主键。因为以后的业务一旦发生改变的时候,主键值可能也需要随着发生变化,但有的时候没有办法变化,因为变化可能会导致主键值重复。
4.1.列级,主键约束
-
drop table if exists t_stu; create table t_stu( no int(10) primary key, class varchar(10), name varchar(20) not null, sex char(2) default 'm' );
-
insert into t_stu(class,name,sex) values ('senior','zs','f');
-
insert into t_stu(no,class,name,sex) values (20,'senior','zs','f');
-
insert into t_stu(no,class,name,sex) values (20,'junior','ww','m');
- 报错:
4.2.表级,主键约束
-
drop table if exists t_stu; create table t_stu( no int(10) , class varchar(10), name varchar(20) not null, sex char(2) default 'm', primary key(no,class) );
-
insert into t_stu(no,class,name,sex) values (20,'senior','zs','f');
-
insert into t_stu(no,class,name,sex) values (20,'junior','ww','m');
-
insert into t_stu(no,class,name,sex) values (20,'junior','ww','m'); // 报错
- 第3句insert会报错
4.3.主键自增——primary key auto_increment(非常重要)
-
drop table if exists t_user; create table t_user( id int primary key auto_increment, // id字段自动维护一个自增的数字,从1开始,以1递增。 username varchar(255) ); insert into t_user(username) values('a'); insert into t_user(username) values('b'); insert into t_user(username) values('c'); insert into t_user(username) values('d'); insert into t_user(username) values('e'); insert into t_user(username) values('f'); select * from t_user;
提示:Oracle当中也提供了一个自增机制,叫做:序列(sequence)对象。
5.外键约束,foreign key
- 外键主要是维护表之间的关系的,主要是为了保证参照完整性。
- 如果表中的某个字段为外键字段,那么该字段的值必须来源于参照的表的主键或unique修饰的字段。
5.1.关于外键约束的相关术语:
* 外键约束: foreign key
-
外键字段:添加有外键约束的字段
-
外键值:外键字段中的每一个值。
-
案例分析:
建立学生和班级表之间的连接。
1.首先建立班级表t_classes -
drop table if exists t_classes; create table t_classes( class_id int(3) primary key, class_name varchar(40) )
-
insert into t_classes(class_id,class_name) values (2020,'BeiJingNo. 1 middle school');
-
insert into t_classes(class_id,class_name) values (2019,'ShangHaiNo. 2 middle school');
2.再建立学生表t_stu
-
drop table if exists t_stu; create table t_stu( no int(10) primary key, name varchar(20) not null, class_id int(3), foreign key(class_id) references t_classes(class_id) );
-
insert into t_stu(no,name,class_id) values (20,'ww',2019); insert into t_stu(no,name,class_id) values (19,'zs',2020);
-
insert into t_stu(no,name,class_id) values (20,'ww',1234);
foreign key的存在,而报错:
-
外键值可以为NULL?
外键可以为NULL。
-
外键字段引用其他表的某个字段的时候,被引用的字段必须是主键吗?
注意:被引用的字段不一定是主键,但至少具有unique约束。
5.x.子表与父表分析
- t_stu中的class_id字段引用t_classes表中的class_id字段,此时t_stu表叫做子表。t_classes表叫做父表。
顺序要求:
1.删除数据的时候,先删除子表,再删除父表。
2.添加数据的时候,先添加父表,在添加子表。
3.创建表的时候,先创建父表,再创建子表。
4.删除表的时候,先删除子表,在删除父表。