Linux_MySQL 表的约束(主键,唯一键,外键,主表,从表)

文章目录

    • 1.空属性 null/not null
    • 2.设置默认值default
    • 3.列描述符comment
    • 4.格式化输出zerofill
    • 5.主键primary key
    • 复合主键
    • 6.自增长 auto_increment
    • 7.唯一键unique key
    • 8.外键foreign key

MySQL本质是一套存储数据的方案,除了解决基本的数据存储外,还需要一定的约束条件,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性,减少用户的误操作可能性。

约束是MySQL通过限制用户操作的方式,来达到维护数据本身的安全和完整的一套方案。

这里主要学习下面几种约束条件

null/not null,default, comment, zerofill,primary key, auto_increment,unique key

1.空属性 null/not null

数据库默认字段为空。这个默认值可以在建表的时候修改

eg:创建学生表

表的信息为学生姓名以及班级,这两个属性在插入的时候不能为空。

这里创建了两个表做对比。
Linux_MySQL 表的约束(主键,唯一键,外键,主表,从表)_第1张图片
Linux_MySQL 表的约束(主键,唯一键,外键,主表,从表)_第2张图片

不允许空值的插入如下图:
Linux_MySQL 表的约束(主键,唯一键,外键,主表,从表)_第3张图片
允许空值插入如下
Linux_MySQL 表的约束(主键,唯一键,外键,主表,从表)_第4张图片

2.设置默认值default

创建表时在对应的字段添加default默认值即可。

Linux_MySQL 表的约束(主键,唯一键,外键,主表,从表)_第5张图片

注意创建表时可以选择不允许默认值,但是修改默认值。在MySQL这个数据库此时not null这个设置选项无意义。尽量不要这样设置。

Linux_MySQL 表的约束(主键,唯一键,外键,主表,从表)_第6张图片

3.列描述符comment

Linux_MySQL 表的约束(主键,唯一键,外键,主表,从表)_第7张图片
列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存。类似于批注功能。告诉使用人这一列的特点。

4.格式化输出zerofill

如果宽度小于类型设定值会自动补充0
Linux_MySQL 表的约束(主键,唯一键,外键,主表,从表)_第8张图片

5.主键primary key

primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。

eg:学生表
学生学号只能有一个,学号设置为主键,当学号重复时发生主键冲突。同时学号这一项不能为空
Linux_MySQL 表的约束(主键,唯一键,外键,主表,从表)_第9张图片
不推荐给主键设置默认值,语法是可以的。主键因为不能重复,默认值只能使用一次毫无意义

删除表的主键:
alter table table_name drop primary key;
Linux_MySQL 表的约束(主键,唯一键,外键,主表,从表)_第10张图片
Linux_MySQL 表的约束(主键,唯一键,外键,主表,从表)_第11张图片
向表中添加主键:
alter table table_name add primary key(添加主键的列名);
Linux_MySQL 表的约束(主键,唯一键,外键,主表,从表)_第12张图片
当将一个列添加为主键时,这一列自动变为不允许默认值。


复合主键

创建表时,可以选择使用多个列来构成一个主键,这种主键称为复合主键。

当构成在主键的所有列冲突时,此时才会发生主键冲突。

eg:选择学生的排名和学号作为复合主键
Linux_MySQL 表的约束(主键,唯一键,外键,主表,从表)_第13张图片

6.自增长 auto_increment

auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。只有主键才可以被设置成自增长,作为逻辑主键。

一般自增长类型为整形,且一个表只有一个自增长类型。

综上:

  • 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
  • 自增长字段必须是整数
  • 一张表最多只能有一个自增长
    Linux_MySQL 表的约束(主键,唯一键,外键,主表,从表)_第14张图片
    Linux_MySQL 表的约束(主键,唯一键,外键,主表,从表)_第15张图片

在设置主键的之后,一般是将与业务逻辑无关的列作为主键,比如自增长序列。

查询最后一次插入的id值函数:
select last_insert_id();
Linux_MySQL 表的约束(主键,唯一键,外键,主表,从表)_第16张图片

7.唯一键unique key

一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。

注意:
唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。

主键和唯一键的区分:

  • 主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。

唯一键的本质目的是为了让数据更加安全,完整性更高。
Linux_MySQL 表的约束(主键,唯一键,外键,主表,从表)_第17张图片

8.外键foreign key

实际业务不可能只有一张表,外键存在的意义是建立表与表之间的关系的

外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。

当定义外键后,要求外键列数据必须在主表的主键列存在或为null。

注意:

  1. 主表是被关联的表,从表是关联其他表的表。

Linux_MySQL 表的约束(主键,唯一键,外键,主表,从表)_第18张图片

外键必须在从表上定义,且对应主表上必须是有主键约束或unique约束。

添加外键语法:
foreign key (字段名) references 主表(列)

eg:创建如上图所示的表结构。

首先创建主表 选课表:

Linux_MySQL 表的约束(主键,唯一键,外键,主表,从表)_第19张图片
其次创建从表 学生信息表:
Linux_MySQL 表的约束(主键,唯一键,外键,主表,从表)_第20张图片

这时语义上面已经存在了外键,但是数据库还无法检测。
eg:
如果此时向从表(学生信息表)中插入一个学生的信息,但这个学生信息的选课号不在选课表里面,从业务逻辑上讲,这次插入应该是失败的,但是因为我们还没有在从表上设置外键,所以在数据库语法上,这次插入会成功。

现在假设这个学校只有两节课,课程信息如下。
Linux_MySQL 表的约束(主键,唯一键,外键,主表,从表)_第21张图片
则插入选课号为600的学生应该不成功,因为学校没有编号为600这个课。但是此时插入会成功。
Linux_MySQL 表的约束(主键,唯一键,外键,主表,从表)_第22张图片
这时候就需要向从表添加外键约束,告诉MySQL这两张表存在约束。

Linux_MySQL 表的约束(主键,唯一键,外键,主表,从表)_第23张图片

你可能感兴趣的:(#,MySQL-Centos7,Linux,mysql)