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.删除表的时候,先删除子表,在删除父表。