如何为SQL Server下TypeORM实体主键配置NONCLUSTERED和NOT ENFORCED
解决方法
方案1:TypeORM 0.3.x及以上版本原生配置
直接在主键装饰器中指定MSSQL专属参数即可适配要求:
@Entity() export class BlenderEvent { @PrimaryGeneratedColumn({ mssql: { isClustered: false, constraint: 'PK_BlenderEvent_id NOT ENFORCED' } }) public id: number; }
配置后重新启动项目,自动生成的主键创建语句会自动带上NONCLUSTERED和NOT ENFORCED属性,适配Synapse SQL Server的要求。
方案2:自定义迁移脚本(全版本兼容,生产优先)
typeorm synchronize自动同步功能本身不推荐在生产环境使用,手动写迁移脚本可以更灵活控制表结构:
- 执行命令生成空迁移文件:
typeorm migration:create src/migrations/CreateBlenderEventTable - 编辑迁移文件内容:
import { MigrationInterface, QueryRunner } from "typeorm"; export class CreateBlenderEventTable1234567890123 implements MigrationInterface { public async up(queryRunner: QueryRunner): Promise<void> { await queryRunner.query(` CREATE TABLE blender_event ( id INT NOT NULL IDENTITY(1,1), -- 此处补充你的其他实体字段 CONSTRAINT PK_BlenderEvent_id PRIMARY KEY NONCLUSTERED (id) NOT ENFORCED ) `); } public async down(queryRunner: QueryRunner): Promise<void> { await queryRunner.query(`DROP TABLE blender_event`); } }
- 执行迁移命令生成表即可,实体类不需要额外修改,正常配置主键装饰器就行。
方案3:0.2.x旧版本兼容方案
如果你用的是不支持mssql专属配置的旧版本TypeORM,可以临时修改SQL Server驱动的主键生成逻辑,拦截建表语句自动追加NONCLUSTERED NOT ENFORCED后缀,该方案仅适合开发测试场景使用,不推荐上生产。
内容的提问来源于stack exchange,提问作者gCardinal
相关产品推荐
相关产品推荐

