TypeORM连接MySQL时未生成预期外键问题咨询
问题原因排查及解决方案
- 实体未完整加入TypeORM配置的实体列表
检查你TypeORM配置(ormconfig.js/ts,或者nestjs的TypeOrmModule配置)中的entities数组,是否同时包含了Area和Subarea两个实体,仅引入单个实体无法识别双向关联,会跳过外键生成。 synchronize配置的局限性
如果你是用开发环境的synchronize: true自动建表,若两个表已经在加关联之前就生成过,TypeORM默认不会修改已存在的表结构新增外键,需要先删除数据库中已有的Area、Subarea表,再重启服务让TypeORM重新建表。- 未生成执行对应迁移文件
若你使用迁移(migrations)模式管理表结构,新增关联后需要执行typeorm migration:generate命令生成对应的迁移文件,再执行迁移才能将外键约束同步到数据库,仅修改实体代码不会自动变更库表结构。 - MySQL存储引擎不支持外键
检查你的MySQL库或者生成的表使用的存储引擎,MyISAM引擎不支持外键约束,需要将默认引擎设置为InnoDB,或者手动修改两张表的引擎为InnoDB。 - 外键生成配置被禁用
首先检查全局TypeORM配置是否设置了createForeignKeyConstraints: false,该配置会全局关闭外键生成;其次检查@ManyToOne装饰器的配置项是否单独加了createForeignKeyConstraints: false,该参数会关闭单条关联的外键生成。 - 关联列名不匹配
你在@JoinColumn中指定了referencedColumnName: 'Id',若你使用TypeORM默认的驼峰转下划线命名策略,Area实体的Id属性实际生成的表列名为id(小写),二者不匹配会导致外键创建失败,可以将referencedColumnName改为id,或者在Area的主键装饰器中指定列名:@PrimaryGeneratedColumn('uuid', { name: 'Id' })。
内容的提问来源于stack exchange,提问作者BruceM
相关产品推荐
相关产品推荐

