[MySQL] auto_increment ์ปฌ๋ผ ๊ฐ์ ์ธ์ ์ฆ๊ฐํ ๊น
MySQL์ auto_increment ๊ฐ์ด ์ฆ๊ฐํ๋ ์์
์ฌ๋ด์์ ํ ์ด๋ธ ๋ฐ์ดํฐ ์์ง์ ์ํด์ ํ ์ด๋ธ ๋ง๋ค ๋ auto increment ์ปฌ๋ผ์ pk๋ก ์ถ๊ฐํด๋ฌ๋ผ๋ ์์ฒญ์ด ์์ด์ ํ ์ด๋ธ ์์ฑ์ ๊ผญ ์ถ๊ฐํ๊ณ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ auto increment ์ปฌ๋ผ์ ๊ฐ์ ์ค์ ๋ก ๋ฐ์ดํฐ๊ฐ ์ ์ฅ(insert)๋ ๋๋ง ์ฌ๋ผ๊ฐ ๊ฑฐ๋ผ๊ณ ์ง๋ ์ง์๋ง ํ๊ณ ์์๋๋ฐ ์ด๋ฒ์ ์ด๋ค ์๋น์ค๋ฅผ ๋นจ๋ฆฌ ๊ฐ๋ฐํด์ค์ผํด์ ์๋ก์ด ํ ์ด๋ธ์ ๋ง๋ค์ด ํ ์คํธํ๋ค๊ฐ auto increment๊ฐ์ด ์์๋๋ก ์ฌ๋ผ๊ฐ์ง ์๋ ํ์์ ๋ณด๊ฒ๋์๋ค.
ํ ์คํธ์ฝ๋๋ insert -> select -> update -> select ์์ผ๋ก ๋์ํ๋๋ก ๊ตฌ์ฑํ๊ณ ๋์ผํ ํ ์คํธ๋ฅผ ์ต์ ๋ ๋ฒ ์ด์ ๋๋ ธ๋ค. ์ด๋ ๊ฒ ๋๋ฆฌ๋๊น ์ฒ์์๋ ๋น์ฐํ ๋์ผํ ๋ฐ์ดํฐ๊ฐ ์์ด์ no๊ฐ์ default๋ก 1๋ก ์์ฑ์ด ๋์๋ค. ํ์ง๋ง ๋๊ฐ์ ํ ์คํธ์ผ์ด์ค๋ฅผ ๋ค์ ๋๋ฆฌ๋ฉด duplicate key exception์ด ๋ฐ์ํ๋ฉด์ ๋ด๋ถ์ ์ผ๋ก auto increment๊ฐ์ด ์ฆ๊ฐํ์ง ์์ ์ค ์์์ผ๋, ์์ธ๊ฐ ๋ฐ์ํ์ฌ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ์ง ๋ชปํ๋คํด๋ insert๊ฐ ์๋๋ ๋๋ง๋ค no๊ฐ์ด ์ฆ๊ฐํ๋ ๊ฒ์ ํ์ธํ ์ ์์๋ค. auto increment๊ฐ์ด ์ฆ๊ฐํ๋ ์ผ์ด์ค๋ฅผ ์ ๋ฆฌํ์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
1. insert๊ฐ ์๋๋๋ฉด no๊ฐ ์ฆ๊ฐํ๊ฒ ๋๋ค.
2. duplication key ์์ธ๊ฐ ๋ฐ์ํ๋คํด๋ ์ฆ๊ฐํ๊ฒ ๋๋ค.
3. update์์๋ ์ฆ๊ฐํ์ง ์์๋ค.
์ผ๋ถ ํ ์ด๋ธ์ ๋ง์ ์์ insert on duplicate key update ๋ฌธ์ ์คํํ๊ณ ์๋๋ฐ auto increment๊ฐ์ด overflow ๋์ง ์์๊น ์ผ๋ ค๋์ด ํ์ฌ max no๊ฐ์ ์กฐํํด๋ณด๋ ์์ง ์ ๋ ์ ๋ฒํธ ์๋ ์์ ์ ๋์๋ค.
๋ง์ฝ overflow ๋ ์ ๋๋ก ๋ง์ด ์ฌ๋ผ๊ฐ๋ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น ??? no ๊ฐ์ ๋ค์ 1๋ก ์ธํ ํ์ฌ ์ฒ์๋ถํฐ ์์ํ๋๋ก ํ ์ ์๊ธฐ๋ ํ๋ค. ์๋ ์ฟผ๋ฆฌ๋ฅผ ์คํ์ํค๋ฉด ๋ค์ 1๋ถํฐ ์ธํ ์ ํด์ค๋ค.
ALTER TABLE YOUR_TABLE_NAME AUTO_INCREMENT=1;
SET @COUNT = 0;
UPDATE YOUR_TABLE_NAME SET AUTO_INCREMENT_COLUMN_NAME = @COUNT:=@COUNT+1;
ํ์ง๋ง ํด๋น ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ๋์ lock์ด ์กํ ๊ฒ์ด๋ผ์ ์ ๊ฒ๋์๋ ์คํ ํ ์ ์์ ๊ฒ์ด๋ค.
์ด ๋ฐฉ๋ฒ ๋ง๊ณ ์ง์ no๋ฅผ ์ธํ ํ๋ ๋ฐฉ๋ฒ๋ ์์ ๊ฒ ๊ฐ๋ค. ๋ฐ์ดํฐ ์ ์ฅ ์์ no๊ฐ์ ์ง์ ํ ๋นํด์ค ์ ์์ผ๋ ๋ง์ด๋ค.