Mysql数据库基础(五)—— Mysql 表的约束

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的记录可以被成功删除。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值