在使用mybatis+springboot完成添加购物车的操作时,往往需要将用户表user表里的user_account字段作为购物车表cart_list里的一个外键,在进行外键关联的时候可能会发生 Cannot add or update a child row: a foreign key constraint fails的错误,即无法添加或更新子行,因为外键约束失败,这说明我们在数据库表进行添加外键的时候可能出了错误,而出现错误的原因大致分为以下几种
1.外键关联的字段不是主键,或者是外键关联的字段不具有唯一性
它的意思就是外键关联的字段里有重复的数值,不具备唯一性,导致映射出错
举个例子:比如一个订单表和一个产品表,订单表中有一个字段是产品ID,用来关联对应的产品信息,如果订单表中的产品ID存在重复的情况,即同一个产品ID对应多个订单记录,这样就会导致映射出错,因为数据库无法确定具体应该关联哪一个产品信息。
订单表(Order):
| 订单ID | 产品ID | 金额 |
| ---- | ---- | ---- |
| 1 | 101 | 100 |
| 2 | 102 | 150 |
| 3 | 101 | 120 |
产品表(Product):
| 产品ID | 产品名称 | 价格 |
| ---- | ---- | ---- |
| 101 | 商品A | 50 |
| 102 | 商品B | 80 |
在订单表中,订单ID为1和3的订单对应的产品ID都是101,这里就存在产品ID重复的情况。这会导致数据库无法准确地将订单与对应的产品信息进行关联,从而导致映射出错的情况发生,所以应确保外键关联字段(产品ID)具有唯一性,简而言之就是不让引用的字段值重复。
2.外键和对应表的主键的值不匹配
它的意思是就是在子表引用一个外键的时候,外键值在父表中不存在
比如在cart_list表中使用user_account作为外键时,user_account的值必须在user表中存在,如果子表中外键的值不存在于父表,那也可能发生此错误
3.外键的数据类型与父表中的不一致
它的意思就是在定义表结构和外键类型时,两表中的字段的结构和数据类型可能不一致
例如在给cart_list表设置外键user_account的时候,要保持字段类型都是int,字段名相同,是否为null也要保持一致!!!同样引擎和字符集也要保持一致