Mysql是和数据打交道的,Mysql必须保证表结构里的数据和类型一致,为此,Mysql 对数据作出了强约束。
目录
1、not null / null
2、default
3、primary key(主键)
3、auto_increment(自增长)
4、unique(唯一键)
5、foreign key(外键)
1、not null / null
Mysql中的 NULL 和 C/C++ 中的不一样!没有主动指定默认值的情况下,数据字段的默认值都是NULL(空),我们需要尽可能保证数据字段不为空,因为数据为空就无法参与运算。
- C/C++:NULL、'\0'、0 在数值上是一样的,都表示0
- Mysql:NULL 表示不存在,既不代表空字符串,也不代表0。Mysql中' ' 或者 " " 表示空字符串
因此,如果我们希望某个字段在插入数据时不能为空,那么我们可以为该字段加上 not null,如果插入数据时,该字段为空,Mysql就会报错。
create table t5 (
class_name varchar(20) not null -- not null 表示数据字段不为空
);
2、default
default 的作用是 在字段被插入数据之前,就预先设置该字段的默认值。添加一条记录时,若该字段插入了新数据,那就使用新数据填充;如果该字段未被赋予任何值,那就使用默认值填充。
create table t5 (
sex varchar(2) default '男' -- 默认值为'男'
);
注意:default 不建议和 not null 搭配使用,既然设置成默认值,该字段就必不可能为空,所以 not null 和 default 搭配使用会失效。
3、primary key(主键)
(1) 主键的特性及基本使用
主键用于约束该字段内容的唯一性,设置为主键的字段不能为空、不能重复,如学号、身份证号等唯一性的字段可以设为主键。一个表最多只能有一个主键。
与主键相关的使用场景有以下三种:第一,在创建表的时候就设置主键。
create table person (
id int unsigned primary key, -- 一般将id设为主键(表索引)
name varchar(20) not null
);
第二,追加主键(前提是当前表中无主键)
-- 追加字段id作为主键
alter table person add primary key(id);
第三,删除主键
-- 删除person表中的主键
alter table person drop primary key
(2) 复合主键
Mysql支持将多个字段设为主键,这就相当于把多个字段当做一个整体(或者理解为集合),这个整体中的字段不允许为空,不同字段的值的组合也不允许重复
create table student(
id int unsigned,
course char(10),
score tinyint unsigned,
primary key(id, course) -- id和course为复合主键
);
insert into student (id,course)values(1, '123'); -- 事先向表中插入一条记录
此时表结构为:
表中的内容为:
如果我们仍然向表中插入 (id, course) values (1, '123') ,此时Mysql就会报错,因为(id, course) values (1, '123') 这个组合在表格中已经存在了。
但是字段course换一个值插入,比如 (id, course) values (1, '456'),此时就可以插入成功。因为id 和 course是一个整体,仅仅只是 id 重复,Mysql不会报错。
3、auto_increment(自增长)
插入记录的时候自动触发,会选出当前字段中已有的最大值,然后自增1作为新的值插入。通常和主键搭配使用。
auto_increment 有如下特点:
- 设置成自增长的字段的作用是索引
- 自增长字段必须是整数
- 一张表最多只能有一个自增长
create table user(
id int unsigned primary key auto_increment -- id作为当前表的索引,设置成自增长
);
4、unique(唯一键)
(1) 唯一键的特性及基本使用
唯一键的作用和主键类似,也是确保字段数据的唯一性(即不能重复),但允许为空。如果一个字段被设置为 unique,那么插入该字段的数据不可以重复。
create table user(
id int unsigned primary key,
phone varchar(11) unique comment '手机号' -- 该字段插入数据时不可以重复
);
注意:当表中已经存在主键时,如果希望其他某些字段同样具备唯一性,而且不为空,我们可以使用 unique not null
(2) 主键和唯一键的关系(为什么需要unique)
话说在前面,主键和唯一键不是互斥关系,而是互补(协助)关系,两者并不冲突。假设我们设置表索引字段 id 作为主键来标识其唯一性,那么我们如果还想让保存手机号、身份证号的字段具备唯一性,又该怎么办?
由于主键只能有一个,所以我们可以使用唯一键 unique 来标识唯一性。
- 不可能每个类只有一个属性是唯一的(不会重复的),实际上可以有很多,比如一个人的学号、身份证、手机号、银行卡都必须要有唯一性。
- 当然也存在不唯一的属性,比如年龄、体重、籍贯、成绩
5、foreign key(外键)
(1) 外键的作用及其基本使用
外键的作用是建立两个表之间的联系,我们通过外键可以获取到当前表中某条记录的补充信息。
举个例子,有这样两个表,一个是学生表,一个是班级表。我们如果想要知道该学生所属班级的信息,我们可以通过拿着外键到班级表中查询,以此来获取到班级信息。
从上图可以看出,要使用外键,至少要有两个表,一个主表(班级表),一个从表(学生表)。可以理解为从表是主表的附属。外键有着如下特性:
- 被设为外键的字段允许重复。因为不同学生可以指向同一个班级。
- 外键必须指向主表的主键。因为如果不是主键,有可能字段会重复,这样可能会引起歧义。
主表:
create table class (
id int primary key auto_increment comment '主表主键',
class_type varchar(3) not null,
number int not null
);
从表(外键所在表),外键语法格式如下:
foreign key (外键字段) references 主表(主表主键)
-- 外键语法格式: foreign key (外键字段) references 主表(主表主键)
create table class (
id int primary key auto_increment comment '从表主键',
name varchar(3) not null,
class_id int,
foreign key (class_id) references class(id) -- 将从表的字段 class_id设为外键
-- 将外键关联到 class表的id字段
);
(2) 外键约束
外键约束伴随着外键产生。(字段被定义成外键以后,也就有了外键约束)。外键约束主要约束两种情况:
第一种,从表插入的外键数据,主表中不存在。因为无法通过该条记录在主表中找到所属内容,此时Mysql会报错。
第二种,主表删除一条记录。若主表中的id = 9 的记录绑定了从表的一部分内容,那么主表的该条记录无法轻易被删除。除非从表中没有学生的class_id 是 9,此时主表中 id = 9的记录可以被成功删除。