[์ฒ™์ฒ™ํ•™์‚ฌ] ๐Ÿšจ PostgreSQL: duplicate key value violates unique constraint ์—๋Ÿฌ ํ•ด๊ฒฐํ•˜๊ธฐ

๋ฐ•์ƒ๋ฏผยท2025๋…„ 8์›” 21์ผ

์ฒ™์ฒ™ํ•™์‚ฌ

๋ชฉ๋ก ๋ณด๊ธฐ
14/28
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๊ฐœ์˜ ๋Œ“๊ธ€