TypeORM中many-to-one关联的cascade: true在MariaDB中失效,如何解决?
问题解答
这不是Bug,ORM里的cascade: true和数据库外键的ON UPDATE/ON DELETE CASCADE根本是两回事:
- ORM的
cascade是应用层的逻辑控制:它管的是你通过ORM操作主实体时,要不要自动对关联的从实体执行对应操作(比如删主实体时,ORM自动遍历删除关联的从实体)。这个逻辑在代码层面运行,和数据库的外键规则没有关系。 - 数据库外键的
ON UPDATE/ON DELETE CASCADE是数据库引擎的约束规则:不管你用不用ORM,只要修改了主表的主键或者删除了主表记录,数据库会直接自动处理从表的关联数据,完全是数据库层面的行为。
至于能不能不用onDelete: "CASCADE"、onUpdate: "CASCADE"解决?
- 如果你想让数据库自身处理关联更新/删除,那必须显式设置这两个参数——因为ORM不会把应用层的
cascade自动同步成数据库外键的级联规则,这是故意的设计,避免混淆两层逻辑。 - 要是不想设置这俩参数,只能靠ORM的
cascade在应用层处理,但这时候数据库外键还是no action。如果哪天你绕开ORM直接用SQL操作数据库,修改或删除主表记录时就会触发外键约束报错。
内容的提问来源于stack exchange,提问作者carnoxen
相关产品推荐
相关产品推荐

