[척척학사] 🚨 PostgreSQL: duplicate key value violates unique constraint μ—λŸ¬ ν•΄κ²°ν•˜κΈ°

박상민·2025λ…„ 8μ›” 21일
0

척척학사

λͺ©λ‘ 보기
14/15
post-thumbnail

척척학사 ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λ˜ 쀑 λ‹€μŒκ³Ό 같은 μ—λŸ¬κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

ERROR: duplicate key value violates unique constraint "student_courses_pkey"
Detail: Key (id)=(1646) already exists.
Transaction silently rolled back because it has been marked as rollback-only

πŸ” 원인 뢄석

제 ν”„λ‘œμ νŠΈμ—μ„œλŠ” StudentCourse μ—”ν‹°ν‹°κ°€ λ‹€μŒκ³Ό 같이 μ„€μ •λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

즉, idλŠ” DBμ—μ„œ μžλ™ 증가(μ‹œν€€μŠ€) λ°©μ‹μœΌλ‘œ μƒμ„±λ©λ‹ˆλ‹€.
κ·ΈλŸ°λ°λ„ idκ°€ μ€‘λ³΅λ˜λ©΄μ„œ μ—λŸ¬κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€.

idλŠ” μžλ™ 증가(μ‹œν€€μŠ€) 섀정이기 λ•Œλ¬Έμ— 쀑볡 ν‚€κ°€ 생길 μ΄μœ κ°€ μ—†λ‹€κ³  μƒκ°ν–ˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜, DB 데이터λ₯Ό ν™•μΈν•΄λ³΄λ‹ˆ 쀑볡 key 값인 1646에 ν•΄λ‹Ήν•˜λŠ” StudentCourse λ ˆμ½”λ“œκ°€ μ‘΄μž¬ν•˜λŠ” 것을 ν™•μΈν–ˆμŠ΅λ‹ˆλ‹€.


❗ μ‹œν€€μŠ€ 뢈일치 문제

원인은 μˆ˜λ™μœΌλ‘œ CSV 데이터λ₯Ό μ‚½μž…ν•œ κ²ƒμ΄μ—ˆμŠ΅λ‹ˆλ‹€.

PostgreSQL은 μžλ™ 증가λ₯Ό μœ„ν•΄ λ‚΄λΆ€μ μœΌλ‘œ μ‹œν€€μŠ€λ₯Ό κ΄€λ¦¬ν•©λ‹ˆλ‹€.
예λ₯Ό λ“€μ–΄ student_courses ν…Œμ΄λΈ”μ˜ κΈ°λ³Έν‚€ μ‹œν€€μŠ€λŠ” student_courses_id_seq μž…λ‹ˆλ‹€.

ν•˜μ§€λ§Œ CSVλ‚˜ SQL둜 id 값을 직접 μ§€μ •ν•΄μ„œ insertν•˜λ©΄, μ‹œν€€μŠ€λŠ” κ·Έ 사싀을 μ•Œμ§€ λͺ»ν•©λ‹ˆλ‹€.
κ²°κ³Όμ μœΌλ‘œβ€¦

  • ν…Œμ΄λΈ”μ—λŠ” id = 1646κΉŒμ§€ 쑴재
  • μ‹œν€€μŠ€ 값은 μ—¬μ „νžˆ 1645에 머무름
  • μƒˆλ‘œμš΄ insert μ‹œλ„ μ‹œ β†’ id = 1646 μž¬μ‚¬μš© β†’ 쀑볡 ν‚€ μ—λŸ¬ λ°œμƒ

βœ… ν•΄κ²° 방법

μ‹œν€€μŠ€ 값을 ν…Œμ΄λΈ”μ˜ ν˜„μž¬ μ΅œλŒ€ id μ΄ν›„λ‘œ μˆ˜λ™ κ°±μ‹ ν•΄μ•Ό ν•©λ‹ˆλ‹€.

-- student_courses ν…Œμ΄λΈ”μ˜ μ΅œλŒ€ id κΈ°μ€€μœΌλ‘œ μ‹œν€€μŠ€ κ°’ μž¬μ„€μ •
SELECT setval('student_courses_id_seq', (SELECT MAX(id) 
FROM student_courses) + 1);

이제 μ‹œν€€μŠ€κ°€ μ •μƒμ μœΌλ‘œ μ΄μ–΄μ„œ 번호λ₯Ό λ°œκΈ‰ν•©λ‹ˆλ‹€.


예방 방법

1. CSV λ“±μœΌλ‘œ 데이터λ₯Ό 넣을 λ•ŒλŠ” idλ₯Ό μƒλž΅ β†’ DB μ‹œν€€μŠ€κ°€ μ•Œμ•„μ„œ 관리  
2. λΆˆκ°€ν”Όν•˜κ²Œ idλ₯Ό μ§€μ •ν•΄μ•Ό ν•œλ‹€λ©΄, μ‚½μž… ν›„ λ°˜λ“œμ‹œ setval()둜 μ‹œν€€μŠ€λ₯Ό μ‘°μ •  

정리

문제  : μžλ™ 증가 μ»¬λŸΌμ—μ„œ 쀑볡 ID λ°œμƒ  
원인  : CSV λ“± μˆ˜λ™ μ‚½μž… μ‹œ μ‹œν€€μŠ€ 값이 κ°±μ‹ λ˜μ§€ μ•ŠμŒ  
ν•΄κ²°  : setval()둜 μ‹œν€€μŠ€λ₯Ό ν…Œμ΄λΈ” μ΅œλŒ€ id + 1 둜 μˆ˜λ™ μ„€μ •  
예방  : μˆ˜λ™ μ‚½μž… ν›„ μ‹œν€€μŠ€ μž¬μ‘°μ •, κ°€λŠ₯ν•˜λ©΄ id μƒλž΅ ν›„ insert  

κ²°λ‘ : PostgreSQLμ—μ„œλŠ” μ‹œν€€μŠ€μ™€ μ‹€μ œ 데이터가 μ–΄κΈ‹λ‚  수 μžˆλ‹€.
특히 μˆ˜λ™ 데이터 μ‚½μž…μ„ ν–ˆλ‹€λ©΄ λ°˜λ“œμ‹œ setval()둜 확인/λ³΄μ •ν•˜λŠ” μŠ΅κ΄€μ΄ ν•„μš”ν•˜λ‹€.

0개의 λŒ“κΈ€