mysql设置外键的好处
阻止执行
从表插入新行,其外键值不是主表的主键值便阻止插入;
从表修改外键值,新值不是主表的主键值便阻止修改;
主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行);
主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)。
级联执行
主表删除行,连带从表的相关行一起删除;
主表修改主键值,连带从表相关行的外键值一起修改。两种方法提供给用户选择。无论选取哪种方法,从表里都不会有多余行。从另一个角度理解,用拒绝同一事物在从表中的标志与主表不一致来实现与主表中的标志一致。
优势:
设置外键可以保证数据的完整性与关联性,杜绝数据冗余
级联操作方便,比如涉及一个离职用户的所有相关信息,可以直接删除这个用户就能做到所有信息一起删除的操作
缺点:
主表进行修改或变更,会波及一大片从表,顿时会使公司部分业务处于不可用的状态,不利中小公司的设计,一般中小型公司都没有dba,开发人员对数据库了解的不够深,容易误操作,所以建议不用使用过多的外键来操作相关业务表
而且对于insert, update, delete等操作时都会先检查外键的约束条件再操作,性能有所下降
个人对于数据库表的设计与理解:
由于个人喜好原因,我设计表的时候并不会考虑外键的添加来增加对数据库操作的复杂性,也不考虑用触发器去解决级联操作的问题,因为触发器的对于表设计而言有一定的隐蔽性,对于后期维护而言有一定的弊端;
程序设计上,属于一张表一个mapper接口服务,这样的弊端是会增加很多的代码量
解决方案之一:不考虑代码量的基础上,使用代码生成器来产生模板代码
解决方案之二:可以使用抽象工厂来生产和适配不同表的接口
-----修改mysql的表结构
--修改自增的初始值 使用alter
alter table mytablename auto_increment=1;