본문 바로가기
개발 Study/Node

[Sequelize] ForeignKey로 Cascade delete 적용하기

by jiyoon_92 2022. 12. 15.
반응형

Sequelize Cascade Delete 적용

sequelize

 

1. Model Column에 외래키 설정

자식 테이블에서 외래키로 설정된 Column에 reference 옵션으로 아래와 같이 외래키를 설정해주고 onDelete 옵션에 "CASCADE"를 설정해 준다.

export class PersonB extends Model<PersonB, PersonDto> {
  @Column({ type: DataTypes.INTEGER, primaryKey:true, references: { model:'member-backup', key:'member_id' }, onDelete: "CASCADE"})
  member_id!: number; //회원id
  @Column({ type: DataTypes.STRING(20), allowNull: true})
  name!: string; //이름
}

PersonB(person-backup) 테이블은 member-backup의 자식테이블로 member_id를 PrimaryKey이자 ForeignKey로 갖는다. 


2. Sequelize Association 설정

sequelize 인스턴스를 생성하고 인스턴스로부터 각 모델들을 가져와 테이블간의 관계를 설정해 준다. 1:1이나 1:N으로 외래키로 관계를 맺은 경우 아래와 같이 설정해주면 된다. 이 때, onDelete : "CASCADE"를 자식 테이블이 belongsTo()함수로 부모테이블에 종속될 때 옵션 설정을 해준다.

const sequelize = this.getBackupInstance();
const m_member_backup = sequelize.model("member-backup");
const m_person_backup = sequelize.model("person-backup");
const m_academy_backup = sequelize.model("academy-backup");

//Member : Academy = 1 : 1
m_member_backup.hasOne(m_academy_backup, {foreignKey: { name : "member_id" }});
m_academy_backup.belongsTo(m_member_backup, {foreignKey: { name : "member_id" }, onDelete:"CASCADE"});
//Member : Person = 1 : 1
m_member_backup.hasOne(m_person_backup, {foreignKey: { name : "member_id" }});
m_person_backup.belongsTo(m_member_backup, {foreignKey: { name : "member_id" }, onDelete:"CASCADE"});

 


반응형

 

3. DB에서 테이블간 제약 사항 확인

위와 같이 옵션 설정을 했는데도 삭제가 안되는 경우 데이터베이스에 접속하여 테이블간의 관계를 확인한다. FK 관계만 설정되어 있어도 Delete 옵션에 Cascade가 설정되어 있지 않은 경우 부모 테이블에 삭제쿼리를 날려도연계된 자식 테이블에서 삭제가 일어나지 않고 에러가 날 수 있다.

Table 제약사항

 

반응형

댓글