framework/Prisma
⚠️ Prisma Referential Actions – 반드시 알아야 할 특별 규칙들
octo54
2025. 6. 17. 14:03
반응형
⚠️ Prisma Referential Actions – 반드시 알아야 할 특별 규칙들
“Cascade 설정했는데 왜 삭제가 안 될까?”
“SQLite에서 SetNull이 안 먹혀?”
👉 referential action이 동작하지 않거나 에러가 나는 이유, Prisma 내부 규칙을 정확히 이해하면 해결됩니다.
✅ 1. 관계에 @relation 명시 없이 동작 설정 불가
model Post {
author User? // ❌ 이렇게만 하면 referential action 적용 안 됨!
}
반드시 명시적으로 작성해야 적용됩니다:
model Post {
authorId Int?
author User? @relation(fields: [authorId], references: [id], onDelete: SetNull)
}
🔐 **fields + references**를 지정하지 않으면 onDelete/onUpdate 설정 자체가 무시됩니다.
✅ 2. onDelete: SetNull 사용 시 외래 키 필드가 nullable이어야 함
model Post {
authorId Int // ❌ non-nullable이면 SetNull 설정 불가
author User @relation(fields: [authorId], references: [id], onDelete: SetNull)
}
수정 방법:
authorId Int? // ✅ nullable 설정 필요
author User? @relation(fields: [authorId], references: [id], onDelete: SetNull)
✅ 3. Composite Foreign Key 사용 시, 모든 필드가 nullable이어야 SetNull 가능
반응형
model Order {
userId Int
storeId Int
user User @relation(fields: [userId, storeId], references: [id, storeId], onDelete: SetNull) // ❌
}
→ userId, storeId 둘 다 nullable로 바꿔야 SetNull 설정 가능
✅ 4. SQLite에서 지원 안 되는 동작 존재
- SQLite는 onUpdate: Cascade는 지원하지만
- onDelete: SetDefault, SetNull 등은 제대로 동작 안 할 수 있음
- 테스트에서는 동작하지만 실제 SQLite 버전에 따라 무시될 수 있음
⚠️ 가능하면 SQLite가 아닌 PostgreSQL, MySQL 사용 권장
✅ 5. NoAction vs Restrict 차이 이해하기
옵션 동작 방식
Restrict | Prisma 레벨에서 강제 차단 (트랜잭션 실행 전 거부) |
NoAction | 데이터베이스에 맡김 → 일부 DB에서는 삭제/업데이트 허용 |
@relation(fields: [authorId], references: [id], onDelete: Restrict) // 안전
@relation(fields: [authorId], references: [id], onDelete: NoAction) // DB마다 다름
✅ 6. Prisma Client에서는 참조 동작이 DB에 위임됨
await prisma.user.delete({ where: { id: 1 } })
- onDelete: Cascade가 설정되어 있다면 → DB가 하위 엔티티도 자동 삭제
- Prisma는 그 자체로 자식 테이블 삭제하지 않음 → DB가 실행
✅ 7. Prisma Migrate 없이 prisma db push만 사용 시 referential actions 누락 가능
- prisma db push는 일부 DB 제약 조건을 완벽히 적용 못 할 수 있음
- 권장 방식은 prisma migrate dev로 마이그레이션 생성하여 적용
🧠 실무 팁 정리
상황 규칙
외래키 필드에 SetNull 설정 | 해당 필드는 nullable이어야 함 |
관계에 onDelete/onUpdate 사용 | @relation(fields, references) 반드시 명시 |
SQLite | 일부 옵션 정상 작동하지 않음 |
복합키 관계에서 SetNull | 모든 외래키가 nullable일 때만 가능 |
Prisma Client | 삭제/변경 동작은 DB에 위임됨 |
마이그레이션 전략 | migrate 방식 사용해야 완전 적용 가능 |
🏁 요약
키포인트 설명
@relation 명시 필수 | 그렇지 않으면 referential action 무효 |
SetNull 사용시 nullable | 외래키 필드 ? 필수 |
SQLite 호환성 낮음 | 테스트 후 도입 권장 |
Prisma는 DB 동작에 의존 | Client에서 직접 하위 삭제 X |
migrate dev 사용 권장 | db push는 불완전 적용 가능성 |
Prisma referential action 규칙,Prisma onDelete SetNull 오류,Prisma 관계 설정 오류,Prisma 외래키 삭제 처리,Prisma SQLite 지원 제한,Prisma 복합키 관계,Prisma db push 제약,Prisma 마이그레이션 실전팁,Prisma relation 오류 해결,Prisma onUpdate NoAction