以下文章来源于何先振,责编小何

自增列就是让某个字段的值自增。通过SQL语法:auto_increment实现。
特点和要求:
一个表最多只能有一个自增长列。
当需要产生唯一标识符或顺序值,可设置自增长。
自增长列约束的列必须是键列(主键列,唯一键列)。
自增约束的列的数据类型必须是整数类型。
如果自增列指定了0和null,会在当前最大值的基础上自增。
如果自增列手动指定了具体值,以手动指定的值为准。
举栗子:
创建表时添加

创建后,添加数据不需要指定id值,因为id是自增长。

修改表时添加写法
先创建表,后面修改添加

查询添加成功。

删除自增列
先查询

删除id自增列

再次查询,已经被删除成功。

自增变量的持久化:
MySQL8.0将自增主键的计数器持久化到重做日志中,每次计数器 发生改变,都会将其写入重做日志中。
如果数据库重启,InnoDB会根据重做日志中的信息来初始化计数器的内存值。
外键约束,用来限制某个表的某个字段的引用完整性。
比如:员工表得员工所在部门的字段,必须在部门表能找到对应的部门。
通过SQL语法:foreign key 表示。
主表和从表:
主表(父表):被引用的表,被参考的表。
从表(子表):引用别人的表,参考别人的表。
例如:员工表的员工所在部门这个字段的值,要引用部门表。部门表是被引用的就是主表,而员工表就是从表。
特点:
要保证引用数据的唯一性,从表的外键列,必须引用主表上的主键或唯一约束的列。
在创建外键时需要给外键命名,如果不命名系统会默认产生一个外键名。
创建表时要加外键,必须先创建主表才能加。
删除表时,需要先删除从表,再删除主表。
如果主表的记录被从表引用了,主表的记录将不能被删除。如果要删除,需要先删除从表中的依赖数据,然后才可以删除主表的数据。
在从表中指定外键约束,一个表可以建立多个外键约束。
从表的外键与主表被引用的列,列名可以不一样,但是数据类型需要一样。
当创建外键时,系统会默认创建一个普通索引,索引名是列名。
删除外键后,需要手动删除对应的索引。
外键约束,举栗子:
创建表时加外键
先创建主表

再创建从表时增加外键,注意外键必须是主表的主键或者唯一约束,否则添加不成功。

查看添加成功

添加外键后,直接插入主表不存在的数据会报错。

需要先在主表中,添加1001这个dept_id的编号。

才能添加从表

在alter table 时添加外键约束
创建从表时没有加外键

可以通过alter table语句,添加外键

约束等级
之所以主表中的数据被从表关联就不能直接删除,是因为主表和从表有约束等级。
约束等级可以分为:
cascade方式:在主表修改或删除记录时,同步删除和修改掉从表的匹配记录。
set null方式:在主表上修改或删除记录时,将从表上关联的记录列设为null,但是要注意从表的外键列不能为not null。
no action方式:如果从表中有匹配的记录,则不允许对主表对应的关联数据进行删除或修改。
restrict方式:同no action,相同。
set default方式:主表有变更时,从表的外键列可以设置一个默认值。但是有些数据库引擎不支持。
添加外键时,如果没有设置约束等级,默认都是restrict。
约束等级,举栗子:
加外键时可以设置update、delete的约束等级。

删除外键约束
添加外键约束后,除了会创建外键约束还会创建普通索引。

需要先删除外键约束

再删除,普通索引

删除成功

实际开发场景:
在实际开发场景中,两个表之间有关系一对一、一对多,它们之间不需要创建外键约束,而是通过程序中判断。
创建外键约束,你的操作会受到约束限制。不创建约束,你的操作不会受到限制,要保证数据的引用完整性,只能依靠程序员的自觉,在程序中限制和判断。
因为在MySQL中,外键约束是有成本的,需要消耗系统资源。对于高并发的SQL操作,可能会因为加了外键约束,系统变慢。所以一般实际开发中不会加外键。
阿里开发规范中也说明:






