MySQL中如何删除被外键约束引用的主键?ON DELETE CASCADE为何不生效
问题解答
- 结论:必须先删除子表对应的外键约束,才能删除父表的主键,这是关系型数据库参照完整性的强制规则,和外键是否配置
ON DELETE CASCADE无关。
很多人会混淆两类完全不同的数据库操作,才会对ON DELETE CASCADE的作用产生误解:
- 你执行的
ALTER TABLE father DROP PRIMARY KEY属于修改表结构的DDL操作,作用是删除父表上的主键约束本身。外键的核心定义要求是:外键必须参照父表中已经存在的主键/唯一约束字段。你如果直接删除被外键参照的主键,相当于直接拆掉了外键的参照基准,数据库会直接拦截操作,无论外键配置了什么级联规则都不会放行。 ON DELETE CASCADE的作用范围仅限操作表数据的DML语句,完全不涉及表结构修改:当你执行DELETE FROM father WHERE ...这类删除父表具体数据行的语句时,配置了该规则的外键不会因为子表存在关联数据就拦截删除操作,而是会自动同步删除child表中所有关联的子数据行,避免产生孤立数据。
问题复现代码
create database table_test; use table_test; create table father( cod int, primary key (cod) ); create table child( cod int, cod_father int, primary key(cod), constraint fk_cod_father foreign key (cod_father) references father(cod) on delete cascade ); -- 执行会报错:外键仍参照father表的cod主键,不允许直接删除父表主键 alter table father drop primary key;
如果你确实需要删除父表主键,请按以下顺序操作
- 第一步:删除child表上名为
fk_cod_father的外键约束 - 第二步:执行father表的主键删除操作
- 第三步:如果后续仍需要外键关联,需等father表新建好可用的主键/唯一键后,再重新创建子表的外键约束
内容的提问来源于stack exchange,提问作者zero
相关产品推荐
相关产品推荐

