约束是在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的合法性、有效性、完整性。
常见的约束有:非空约束(not null)、唯一约束(unique)、主键约束(primary key)、外键约束(foreign key)、检查约束(check)
非空约束:约束的字段不能为NULL
唯一约束:约束的字段不能重复
主键约束:(PK)约束的字段既不能为NULL,也不能重复
外键约束:(FK)
create table t_user(id int,username varchar(255) not null,password varchar(255));
insert into t_user(id,username,password) values(1,'123','111111');
注意:not null 只有列级约束,没有表级约束
唯一约束修饰的字段具有唯一性,不能重复,但可以为NULL。
案例:给某一列添加 unique
案例:给两个列或者多个列添加 unique
create table t_user (id int, usercode varchar(255), username varchar(255), unique(usercode,username)); //多个字段联合添加约束(表级约束)
create table t_user (id int, usercode varchar(255) unique, username varchar(255),unique); //列级约束
怎么给一张表添加主键约束呢?
drop table if exists t_user;
create table t_user(id int primary key,username varchar(255),email varchar(255));
insert into t_user(id,username,email) values(1,'zs','[email protected]');
insert into t_user(id,username,email) values(2,'ls','[email protected]');
insert into t_user(id,username,email) values(3,'ww','[email protected]');
select * from t_user;
insert into t_user(id,username,email) values(1,'jack','[email protected]');
insert into t_user(username,email) values('jack','[email protected]');
通过以上测试得出,id 是主键,因为添加了主键约束,主键字段中的数据不能为NULL,也不能重复。
主键相关术语:主键约束、主键字段、主键值
主键作用:表的设计三范式中有要求,第一范式就要求任何一张表都应该有主键。
主键值是这行记录在这张表中的唯一标识。
一张表的主键约束只能有一个。
主键分类:
根据主键字段的字段数量来划分:单一主键和复合主键(多个字段联合起来添加一个主键约束,但复合主键不适合使用,因为复合主键违背三范式。)
根据主键性质来划分:自然主键和业务主键(主键值和业务挂钩,例如:拿银行卡卡号作为,不推荐使用)最好不要拿着和业务挂钩的字段作为主键,因为以后的业务变化一旦发生改变的时候,主键值可能也需要随着发生变化,但有的时候没有办法变化,因为变化可能会导致主键值重复。
使用表级约束方式定义主键:
drop table if exists t_user;
create table t_user(id int,username varchar(255),primary key(id));
insert into t_user(id,username) values(1,'zs');
insert into t_user(id,username) values(2,'ls');
insert into t_user(id,username) values(3,'ww');
select * from t_user;
Mysql 提供主键值自增:
drop table if exists t_user;
create table t_user(id int primary key auto_increment,username varchar(255));
insert into t_user(username) values('zs');
insert into t_user(username) values('ls');
insert into t_user(username) values('ww');
select * from t_user;
外键约束的相关术语:
外键约束:foreign key
外键字段:添加有外键约束的字段
外键值:外键字段中的每一个值
业务背景:
请设计数据库表,用来维护学生和班级的信息。
第一种方案:一张表存储所有数据(有冗余)
第二种方案:两张表(班级表和学生表)
将以上表的建表语句写出来:
t_student 中的classno字段引用 t_class 表中的cno字段,此时t_student 表叫做子表,t_class表叫做父表。
删除数据的时候,先删除子表,再删除父表;
添加数据的时候,先添加父表,再添加子表;
创建表的时候,先创建父表,再创建子表;
删除表的时候,先删除子表,再删除父表。
drop table if exists t_student;
drop table if exists t_class;
create table t_class(cno int primary key,cname varchar(255));
create table t_student(sno int ,sname varchar(255),classno int, foreign key(classno) references t_class(cno));
insert into t_class values(101,'abc'),(102,'def');
insert into t_student values(1,'zs1',101),(2,'zs2',101),(3,'zs3',102),(4,'zs4',102),(5,'zs5',102),(6,'zs6',102);
select * from t_user;
select * from t_student;
外键可以为NULL?
注意:被引用的字段不一定是主键,但至少具有unique约束。