sqlite 尝试删除包含OneToMany关系的实体时出现错误“FOREIGN KEY约束失败”

p1iqtdky  于 2023-10-23  发布在  SQLite
关注(0)|答案(1)|浏览(157)

当我尝试删除包含OneToMany关系的实体时,我在控制台上得到一个错误:

query failed:  DELETE FROM "task_group_entity" WHERE "id" = ? -- PARAMETERS: ["63361153-83cc-49b8-ba12-19f54e0519a2"]
error:  Error: Run: RunSQL: run: FOREIGN KEY constraint failed

我用的是capacitor-sqlite+ typeplayer。
下面是我的实体代码:
关系主方:

@Entity()
export class TaskGroupEntity {

    @PrimaryGeneratedColumn("uuid")
    id: string;

    @Column('datetime', { nullable: true })
    dayTaskDate: Date | null;

    @Column('text', { nullable: true })
    name: string | null;

    @Column('text', { nullable: true })
    description: string | null;

    @OneToMany(() => TaskEntity, task => task.taskGroup, { nullable: true, cascade: true, onDelete: "CASCADE" })
    tasks: (TaskEntity | null)[];

    @Column('text', { nullable: true })
    color: string | null;

    @Column('text', { nullable: true })
    icon: string | null;

    // Already added cascade: true on the other side of the relationship, this column doesn't seem to have anything to do with the problem
    @ManyToMany(() => TagEntity, tag => tag.taskGroups, { nullable: true, onDelete: "CASCADE" })
    @JoinTable()
    tags: (TagEntity | null)[];

    @CreateDateColumn()
    createDate: Date;

    @DeleteDateColumn()
    deleteDate: Date;

    @Column('datetime', { nullable: true })
    deadLineDate: Date | null;

    @Column('text')
    repeatMode: RepeatMode;

    @Column('simple-json', { nullable: true })
    repeatCustom: RepeatCustom | null;

}

关系的另一面:

@Entity()
export class TaskEntity {

    @PrimaryGeneratedColumn("uuid")
    id: string;

    // ...

    @ManyToOne(() => TaskGroupEntity, taskGroup => taskGroup.tasks, { nullable: true })
    taskGroup: TaskGroupEntity | null;

    @ManyToOne(() => TaskEntity, task => task.childTasks, { nullable: true })
    parentTask: TaskEntity | null;

    @OneToMany(() => TaskEntity, task => task.parentTask, { nullable: true })
    childTasks: TaskEntity[] | null[];

}

我试着在谷歌上搜索一个解决方案,有人提到要指定onDelete:OneToMany注解中的“CASCADE”。但当我尝试它时,它仍然报告错误。
然后我尝试将onDelete设置为SET NULL,它仍然报告错误。
然后我尝试使用softDelete删除实体,它工作了。
但是当我试图硬删除实体时,错误又回来了。
然后我尝试删除没有包含关系的实体(即,列是空数组),并且没有报告错误。
我是SQL新手,如何正确删除包含OneToMany关系的实体?

h43kikqp

h43kikqp1#

好吧,我意识到我非常愚蠢,不得不将onDelete: "CASCADE"添加到关系的两边,以便级联正确工作。

相关问题