能否删除Model1主键且不引发Model2外键完整性错误?
关于删除Model1主键是否引发完整性错误的解答
首先明确模型对应关系:你提到的Model1应该是SimulatorTrainingEnvironment,Model2是定义了ste_id外键的模型,先看你给出的关键配置:
ste_id = models.ForeignKey( SimulatorTrainingEnvironment, related_name="environmenthistory", on_delete=models.DO_NOTHING, blank=True, null=True, default="", )
直接给结论:删除Model1的主键记录有可能触发完整性错误,核心取决于两个点:
- 你的数据库是否开启了外键约束:
- 像PostgreSQL这类数据库默认开启外键约束,哪怕Django设置了
DO_NOTHING,只要Model2里存在引用该主键的记录,删除Model1的这条记录时,数据库会直接抛出完整性错误,阻止删除操作。 - 如果是MySQL用MyISAM引擎(不支持外键),或者手动关闭了外键约束,删除Model1的记录不会报错,但Model2里的
ste_id会留下无效的UUID值,造成数据不一致。
- 像PostgreSQL这类数据库默认开启外键约束,哪怕Django设置了
on_delete=models.DO_NOTHING的含义是Django不会主动处理关联的Model2记录,完全把约束检查交给数据库,它本身不会阻止数据库抛出错误。
另外补充:null=True只是允许ste_id字段为空,不影响已存在的关联记录的约束检查——只要Model2里有记录引用了Model1的主键,删除该主键就可能触发数据库层面的完整性错误。
内容的提问来源于stack exchange,提问作者Neo
相关产品推荐
相关产品推荐

