MySQL:约束

144 阅读3分钟

约束(constraint)

什么是约束?

在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的合法性、有效性、完整性

常见的约束有哪些呢?

  • 非空约束(not null):约束的字段不能为NULL
  • 唯一约束(unique):约束的字段不能重复
  • 主键约束(primary key):约束的字段不能为NULL,也不能重复
  • 外键约束(foreign key):
  • 检查约束(check):注意,Oracle数据库有check约束,但是MySQL没有,目前MySQL不支持该约束

not null用法

not null:只有列级约束
create table 表名(
 字段名1 数据类型 not null,
 字段名2 数据类型,
 字段名3 数据类型,
 ……
);
===========================================
drop table if exists t_student;
create table t_student (
 stuno bigint not null, //非空约束
 name varchar(255) default xxx,
 sex char(1),
 classno varchar(255),
 birth char(10)
);

unique用法

【列级约束】
create table t_student (
 stuno bigint unique,   //唯一约束
 name varchar(255),
 sex char(1),
 classno varchar(255),
 birth char(10)
);

扩展:给两个或多个字段联合添加unique【表级约束】

create table t_student (
 stuno bigint,
 name varchar(255),
 sex char(1),
 classno varchar(255),
 birth char(10),
​
 //代表的是,stuno和name相同时,才会执行效果
 unique(stuno,name)
);

primary key 主键约束

怎么给一张表添加主键约束?

主键约束的特点“不能为NULL,也不能重复
create table t_student (
 stuno bigint primary key,
 name varchar(255),
 sex char(1),
 classno varchar(255),
 birth char(10),
);
​
注意:一张表的主键约束只能有一个

主键有什么作用?

  • 表的设计三范式中有需求,第一范式就是要求任何一张表都应该有主键
  • 主键的作用:主键值是这行记录在这张表当中的唯一标识(像身份证号码)

主键的分类

根据主键字段的字段数量划分

  • 单一主键(推荐,常用)
  • 复合主键(多个字段联合起来添加一个主键约束,不建议使用,因为主键违背三范式)

根据业务性质来划分

  • 自然主键:主键值最好就是一个和业务没有任何关系的自然数
  • 业务主键:(不推荐)主键值和系统业务挂钩,例如 拿着银行卡的卡号做主键,拿着身份证号码做主键。最好不要拿着和业务挂钩的字段作为主键。因为以后的业务一旦发生改变的时候,主键值可能也需要随之发生变化。但有时候实在没办法变化。

主键值递增

create table t_student (
 stuno bigint primary key auto_increment,  // stuno字段自动维护一个自增的数字,从1开始,以1递增
 name varchar(255),
 sex char(1)    //最后一个不能有逗号
);
insert into t_student(name) values('a');
insert into t_student(name) values('b');
insert into t_student(name) values('c');

这样就不需要用户手动去提供主键值了

foreign key 外键约束

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(
stuno int primary key,
stuname varchar(255),
    classno int,
foreign key(classno) references t_class(cno)
);
​
先创父,再创子,先删子,再删父。
上述的,t_class为父,t_student为子,子引用父的值作为外键
使用外键约束的字段的值不能随便写,字段值必须来自某一张表的某个字段的数据
  • 被外键引用的字段的值,不一定是主键,但至少有unique约束(唯一性)

要不然父表中的cno字段重复了的话,引用的那一行的数据,比如说cname是一班还是二班那就分不清了

  • 外键值可以为NULL
  • 子表中外键引用的字段的值,父表中这个字段一定要有这个值