반응형
Sequelize Cascade Delete 적용
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가 설정되어 있지 않은 경우 부모 테이블에 삭제쿼리를 날려도연계된 자식 테이블에서 삭제가 일어나지 않고 에러가 날 수 있다.
반응형
'개발 Study > Node' 카테고리의 다른 글
[Sequelize/Node.js] commit has been called on this transaction 에러 해결 (1) | 2023.01.31 |
---|---|
[Node.js] 공공 오픈 API 이용하기 - 지하철 노선 전체 정보 가져오기 (2) | 2022.12.16 |
[Node.js] 공공 오픈 API 이용하기 - 사업자 휴/폐업 실시간 조회 (5) | 2022.10.20 |
[Node.js] 비밀번호 암호화(bcrypt HASH) (0) | 2022.10.06 |
[SocketIO/WebRTC] 줌 클론 코딩(2) - WebRTC로 카메라 연결하기 (3) | 2022.08.23 |
댓글