MySQL学习
五、约束(Constraint)
1.定义
在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的合法性、有效性、完整性。
常见约束有:
①非空约束(not null):约束的字段不能为NULL
②唯一约束(unique):约束的字段不能重复
③主键约束(primary key):约束的字段既不能为NULL也不能重复(简称PK)
④外键约束(foreign key):(简称FK)
⑤检查约束(check):Oracle数据库有check约束,但MySQL没有。
2. 非空约束 not null
drop table if exists t_user;
create table t_user(
id int,
username varchar(255) not null,
password varchar(255)
);
// 语句不能执行,缺少非空约束 username,会报错
insert into t_user(id,password) values (1,'123');
insert into t_user(id,username,password) values (1,'meimei',123');
非空约束只能加到字段后面,只有列级约束。
3. 唯一约束 unique
唯一约束修饰的字段具有唯一性,不能重复,但可以为NULL(NULL不是值,两个NULL不能画等号,即可以有多个NULL的情况)。
唯一约束添加的位置和非空约束添加的位置相同。
案例:给某一列添加unique :
create table t_user(
id int,
username varchar(255) unique,
password varchar(255)
);
案例:给两个列或者多个列添加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
);
unique在列后面添加:列级约束
unique在所有声明完之后添加:表级约束(多个字段联合约束用表级约束)
4. 主键约束 primary key
4.1 给一张表添加主键约束:添加在字段后面即可
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,'zhangsan','zs@123.com');
insert into t_user (id,username,email) values (2,'lisi','ls@123.com');
insert into t_user (id,username,email) values (3,'wangwu','ww@123.com');
根据以上的测试得出:id是主键,因为添加了主键约束,主键字段中的数据不能为NULL,也不能重复。
主键的特点:不能为NULL,也不能重复。
4.2 主键相关的术语
主键约束就是:primary key
主键字段:带有主键约束的字段
主键值:主键字段插入的值
4.3 主键的作用
表的设计三范式有要求,第一范式就要求任何一张表都应该有主键。
主键的作用是:添加主键的这行是记录在这张表当中的唯一标识。(类似于人的身份证号码)
4.4 主键的分类
根据主键字段的数量来划分:单一主键(推荐的,常用的)和复合主键(多个字段联合添加一个主键约束,复合主键不建议使用,因为复合主键违背三范式)。
根据主键的性质来划分:自然主键(主键最好就是和业务没有关系的自然数,例如编号id)和业务主键(主键值和系统的业务挂钩,例如:拿银行卡的卡号做主键、拿身份证号码做主键,不推荐用)。最好不要拿和业务挂钩的字段作为主键,因为以后一旦业务发生变化,主键值可能也需要随着变化,但有时主键是没法变化的,因为变化就会导致主键值重复。
🔺一张表只能有一个主键约束。
4.5 使用表级约束的方式定义主键
drop table if exists t_user;
create table t_user (
id int,
username varchar(255),
primary key(id)
);
4.6 MySQL提供主键值自增(★非常重要★)
drop table if exists t_user;
create table t_user (
id int primary key auto_increment,
username varchar(255),
email varchar(255)
);
往表里insert数据的时候id不赋值也会自动增加。(主键值起到一个标识的作用即可,不需要有任何的含义)
5. 外键约束 foreign key
5.1 外键约束的相关术语
外键约束:foreign key
外键字段:添加有外键约束的字段
外键值:外键字段中的每一个值
5.2 外键约束的定义
案例背景:两张表,一张学生表,一张班级表,班级表中记录班级信息。t_student称为子表,t_class称为父表,子表中的一项classno(fk)必须是父表对应cno(pk)这一列的内容。
顺序要求:删表的时候要先删子,再删父,创建表或者添加数据时应先父表,再子表。
drop table if exists t_student;
drop table if exists t_class;
create table t_class(
cno int,
cname varchar(255),
primary key(cno)
);
create table t_student(
sno int,
sname varchar(255),
classno int,
foreign key(classno) references t_class(cno)
);
insert into t_class values(101,'xxxxxxx');
insert into t_class values(102,'yyyyyyy');
insert into t_student values (1,'zs',101);
insert into t_student values (2,'1s',101);
insert into t_student values (3'ww',102);
select * from t_class;
select * from t_student;
外键值可以为NULL。
子表的外键连到主表的字段,主表的那个字段不一定为主键,但起码具有唯一性(unique约束),但一般情况下都是引用主键。