使用 TypeOrm 的 Postgres 级联删除:表“table1”上的更新或删除违反表“table2”上的外键约束

inf*_*dev 11 postgresql orm node.js typescript typeorm

我正在尝试使用 TypeORM删除file依赖于表的表上的记录fileDevice

其实我得到这个错误

“更新或删除表“文件”违反表“文件设备”上的外键约束“FK_4dcd99898oij89898909c2603”

这是我声明表的方式:

export class File {
  @PrimaryGeneratedColumn()
  id: number;

  @Column()
  idFonc: number;

  @Column()
  version: number;

  @Column('varchar', { length: 100 })
  filename: string;

  @Column({ nullable: true })
  lastModified: Date;

  @Column()
  device: boolean;

  @Column({ nullable: false })
  typeId: number;

  @ManyToOne(type => Type)
  @JoinColumn({ referencedColumnName: 'id' })
  type: Type;

  @OneToMany(type => FileDevice, filedevice => filedevice.file)
  fileDevice: Promise<FileDevice[]>;
}
Run Code Online (Sandbox Code Playgroud)

和文件设备

export class FileDevice {
  @PrimaryGeneratedColumn()
  id: number;

  @ManyToOne(type => File, f => f.fileDevice, {
    nullable: false,
    onDelete: 'CASCADE',
  })
  file: File;

  @Column('varchar', { length: 100 })
  deviceid: string;
}
Run Code Online (Sandbox Code Playgroud)

使用 TypeORM 我删除了几个文件:

this.fileRepository.remove(filesListToDelete);
Run Code Online (Sandbox Code Playgroud)

我收到上面提到的错误。

我试图添加onDelete: 'CASCADE'到实体的定义中:

@OneToMany(type => FileDevice, filedevice => filedevice.file, {
  onDelete: 'CASCADE',
})
fileDevice: Promise<FileDevice[]>;
Run Code Online (Sandbox Code Playgroud)

但我仍然有同样的错误。

我应该fileDevicefilesList file表上删除然后在表上删除吗?

mon*_*yfy 5

我也遇到了类似的问题,在 typeorm 版本中0.2.45我通过在新生成的迁移文件中添加两行来修复它:

第一:删除约束:

await queryRunner.query(`ALTER TABLE "FileDevice" DROP CONSTRAINT "FK_4dcd99898oij89898909c2603"`);
Run Code Online (Sandbox Code Playgroud)

然后添加带有更新级联的约束:

await queryRunner.query(`ALTER TABLE "FileDevice" ADD CONSTRAINT "FK_4dcd99898oij89898909c2603" FOREIGN KEY ("fileId") REFERENCES "file"("id") ON DELETE CASCADE ON UPDATE CASCADE`);
Run Code Online (Sandbox Code Playgroud)

当您运行此迁移时,解决问题。

仅供参考:仅当您正确设置迁移时,此操作才有效,如果您使用迁移,只需在 DB shell 或查询工具上运行上述查询即可。


小智 2

如果迁移文件中FileDevice有的话,您需要添加这一点。迁移文件中非常需要注意。 onDelete: 'CASCADE'

foreignKeys: [
                {
                    referencedTableName: 'file',
                    referencedColumnNames: ['id'],
                    columnNames: ['file'],
                    onDelete: 'CASCADE',

                }
]

Run Code Online (Sandbox Code Playgroud)