mysql删除修改记录报错:Cannot delete or update a parent row:a foreign key constraint fails. 外键约束失败
mysql删除记录报错
Cannot delete or update a parent row:a foreign key constraint fails...... ON DELETE NO ACTION ON UPDATE NO ACTION
报错为外键约束失败
外键约束
外键(FOREIGN KEY)为表的一个特殊字段,常与主键约束同时使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。比如,一个水果摊,只有苹果、桃子、李子、西瓜等 4 种水果,那么,你来到水果摊要买水果就只能选择苹果、桃子、李子和西瓜,其它的水果都是不能购买的。
主表删除某条记录时,从表中与之对应的记录也必须有相应的改变。一个表可以有一个或多个外键,外键可以为空值,若不为空值,则每一个外键的值必须等于主表中主键的某个值。
定义外键时,需要遵守下列规则:
主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
必须为主表定义主键。
主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。
外键中列的数目必须和主表的主键中列的数目相同。
外键中列的数据类型必须和主表主键中对应列的数据类型相同。
处理方式
1.临时禁用外键检查
mysql> SET FOREIGN_KEY_CHECKS = 0; # 临时禁用 mysql>需要执行的mysql语句(delete/update...) mysql> SET FOREIGN_KEY_CHECKS = 1; #恢复
2.删除与此表外键关联的表(不推荐)
直接DROP 表名
3.将表更新方式设置为级联(根治)
撤销原有的外键约束
ALTER TABLE table1 DROP FOREIGN KEY 外键名
重新设置约束,注意设置成CASCADE
ALTER TABLE tablename ADD CONSTRAINT 外键名 FOREIGN KEY (s_id) REFERENCES student(s_Id) ON DELETE CASCADE ON UPDATE CASCADE;
最后执行修改删除的sql语句,此时主表更新后从表也会同步更新
mysql表更新方式
1.cascade:级联,当父表更新、删除,子表会同步更新和删除
2.set null:置空,当父表更新、删除的时候,字表会把外键字段变为null,所以这个时候设计表的时候该字段要允许为null,否则会出错
3.restrict:父表在删除和更新记录的时候,要在子表中检查是否有有关该父表要更新和删除的记录,如果有,则不允许删除个更改
4.no action:和restrict一样