λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
μΉ΄ν…Œκ³ λ¦¬ μ—†μŒ

였라클 insert μžλ™μ¦κ°€ 컬럼의 μ΅œλŒ€κ°’ +1ν•˜κΈ° (MAX+1)

by 5566 2023. 9. 8.

1. μ„œλ‘ 

μ„œλ‘ μ—μ„œλŠ” 였라클 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ insert μž‘μ—…μ„ μˆ˜ν–‰ν•  λ•Œ μžλ™μœΌλ‘œ μ¦κ°€ν•˜λŠ” μ»¬λŸΌμ„ λ‹€λ£¨λŠ” κ°œλ…μ— λŒ€ν•΄ μ„€λͺ…ν•  κ²ƒμž…λ‹ˆλ‹€. 이번 κΈ€μ—μ„œλŠ” ν•΄λ‹Ή 컬럼의 μ΅œλŒ€κ°’μ„ μ°Ύκ³ , κ·Έ 값에 1을 λ”ν•΄μ£ΌλŠ” 방법에 λŒ€ν•΄ λ‹€λ£° κ²ƒμž…λ‹ˆλ‹€. 이λ₯Ό 톡해 λ°μ΄ν„°λ² μ΄μŠ€μ— 데이터λ₯Ό μ €μž₯ν•  λ•Œ μžλ™μœΌλ‘œ μ¦κ°€ν•˜λŠ” μ‹λ³„μžλ₯Ό λ‹€λ£¨λŠ” 방법을 μ•Œμ•„λ³΄λ„λ‘ ν•˜κ² μŠ΅λ‹ˆλ‹€.

2. 였라클 insert μžλ™μ¦κ°€ 컬럼의 κ°œλ…

였라클 λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œλŠ” μžλ™μœΌλ‘œ μ¦κ°€ν•˜λŠ” μ»¬λŸΌμ„ 생성할 수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ μ»¬λŸΌμ€ 일반적으둜 μ‹λ³„μžλ‘œ μ‚¬μš©λ˜λ©°, 각 행에 λŒ€ν•΄ κ³ μœ ν•œ 값을 μžλ™μœΌλ‘œ μƒμ„±ν•΄μ€λ‹ˆλ‹€. 이λ₯Ό 톡해 데이터λ₯Ό μ‰½κ²Œ μ‹λ³„ν•˜κ³  관리할 수 있게 λ©λ‹ˆλ‹€.

μžλ™μ¦κ°€ μ»¬λŸΌμ„ μƒμ„±ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ°μ΄ν„°ν˜•μœΌλ‘œ NUMBERλ₯Ό μ„ νƒν•˜κ³ , GENERATED ALWAYS AS IDENTITY와 같은 속성을 지정해야 ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•  경우, 컬럼의 값은 INSERT 문을 μ‹€ν–‰ν•  λ•Œ μžλ™μœΌλ‘œ μ¦κ°€ν•˜κ²Œ λ©λ‹ˆλ‹€.

예λ₯Ό λ“€μ–΄, λ‹€μŒκ³Ό 같이 μžλ™μ¦κ°€ μ»¬λŸΌμ„ 생성할 수 μžˆμŠ΅λ‹ˆλ‹€.

CREATE TABLE my_table (
  id NUMBER GENERATED ALWAYS AS IDENTITY,
  name VARCHAR2(50),
  age NUMBER
);

μœ„μ˜ μ˜ˆμ‹œμ—μ„œ id μ»¬λŸΌμ€ μžλ™μœΌλ‘œ μ¦κ°€ν•˜λŠ” 컬럼으둜 μ„€μ •λ˜μ—ˆμŠ΅λ‹ˆλ‹€. INSERT 문을 μ‹€ν–‰ν•  λ•Œλ§ˆλ‹€ id 값은 μžλ™μœΌλ‘œ μ¦κ°€ν•˜μ—¬ κ³ μœ ν•œ 값을 κ°€μ§€κ²Œ λ©λ‹ˆλ‹€. 이후 데이터 μ‘°νšŒλ‚˜ μˆ˜μ • λ“±μ˜ μž‘μ—…μ—λŠ” 이 μ‹λ³„μžλ₯Ό μ‚¬μš©ν•˜μ—¬ νŠΉμ • 행을 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

3. μžλ™μ¦κ°€ 컬럼의 μ΅œλŒ€κ°’ μ°ΎκΈ°

μžλ™μ¦κ°€ μ»¬λŸΌμ„ μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό μ‚½μž…ν•  λ•Œλ§ˆλ‹€ ν•΄λ‹Ή μ»¬λŸΌμ€ μžλ™μœΌλ‘œ μ¦κ°€ν•˜μ—¬ κ³ μœ ν•œ 값을 κ°€μ§€κ²Œ λ©λ‹ˆλ‹€. λ•Œλ‘œλŠ” 이런 μžλ™μ¦κ°€ 컬럼의 μ΅œλŒ€κ°’μ„ μ°Ύκ³ , κ·Έ 값을 기반으둜 λ‹€μŒμ— μ‚½μž…λ  값에 λŒ€ν•œ 예츑이 ν•„μš”ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ•„λž˜λŠ” μžλ™μ¦κ°€ 컬럼의 μ΅œλŒ€κ°’μ„ μ°ΎλŠ” λ°©λ²•μž…λ‹ˆλ‹€.

SELECT MAX(id) FROM my_table;

μœ„μ˜ 쿼리λ₯Ό μ‹€ν–‰ν•˜λ©΄ my_table ν…Œμ΄λΈ”μ˜ id 컬럼의 μ΅œλŒ€κ°’μ΄ λ°˜ν™˜λ©λ‹ˆλ‹€. 이λ₯Ό 기반으둜 λ‹€μŒμ— μ‚½μž…λ  값에 λŒ€ν•œ μ˜ˆμΈ‘μ„ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ΅œλŒ€κ°’μ΄ 10이라면 λ‹€μŒμ— μ‚½μž…λ  값은 11이 될 κ²ƒμž…λ‹ˆλ‹€.

λ˜ν•œ, μžλ™μ¦κ°€ 컬럼의 μ΅œλŒ€κ°’μ„ 찾을 λ•Œ νŠΉμ • 쑰건을 μ μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, νŠΉμ • 쑰건을 λ§Œμ‘±ν•˜λŠ” ν–‰ μ€‘μ—μ„œ μžλ™μ¦κ°€ 컬럼의 μ΅œλŒ€κ°’μ„ 찾고자 ν•  λ•Œμ—λŠ” WHERE μ ˆμ„ μ‚¬μš©ν•˜μ—¬ μ›ν•˜λŠ” 쑰건을 μ§€μ •ν•˜λ©΄ λ©λ‹ˆλ‹€.

SELECT MAX(id) FROM my_table WHERE age > 20;

μœ„μ˜ μΏΌλ¦¬λŠ” my_table ν…Œμ΄λΈ”μ—μ„œ ageκ°€ 20보닀 큰 ν–‰λ“€ μ€‘μ—μ„œ id 컬럼의 μ΅œλŒ€κ°’μ„ 찾게 λ©λ‹ˆλ‹€. μ΅œλŒ€κ°’μ„ μ°ΎλŠ” 것은 맀우 μœ μš©ν•œ μž‘μ—…μ΄λ©°, λ‹€μŒμ— μ‚½μž…λ  값에 λŒ€ν•œ μ˜ˆμΈ‘μ„ κ°€λŠ₯ν•˜κ²Œ ν•΄μ€λ‹ˆλ‹€.

4. μ΅œλŒ€κ°’ + 1 μ μš©ν•˜κΈ°

μžλ™μ¦κ°€ μ»¬λŸΌμ„ μ‚¬μš©ν•˜μ—¬ 데이터λ₯Ό μ‚½μž…ν•  λ•Œ, 보톡은 ν•΄λ‹Ή 컬럼의 μ΅œλŒ€κ°’μ„ 찾은 λ‹€μŒμ— 이 값을 기반으둜 λ‹€μŒμ— μ‚½μž…λ  값에 λŒ€ν•œ μ˜ˆμΈ‘μ„ ν•˜κ²Œ λ©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, ν˜„μž¬ ν…Œμ΄λΈ”μ˜ μžλ™μ¦κ°€ 컬럼의 μ΅œλŒ€κ°’μ΄ 10이라면, λ‹€μŒμ— μ‚½μž…λ  값은 11둜 μ˜ˆμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, 이 값을 기반으둜 INSERT 문을 μž‘μ„±ν•˜μ—¬ μƒˆλ‘œμš΄ 데이터λ₯Ό μ‚½μž…ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

INSERT INTO my_table (id, name, age)
VALUES ((SELECT MAX(id) + 1 FROM my_table), 'John', 25);

μœ„μ˜ μ˜ˆμ‹œμ—μ„œλŠ” μƒˆλ‘œμš΄ 데이터λ₯Ό μ‚½μž…ν•˜κΈ° μœ„ν•΄ INSERT INTO 문을 μ‚¬μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€. id 컬럼의 κ°’μœΌλ‘œ (SELECT MAX(id) + 1 FROM my_table)을 μ‚¬μš©ν•˜μ—¬, 이전에 μ €μž₯된 λ°μ΄ν„°μ˜ μžλ™μ¦κ°€ 컬럼의 μ΅œλŒ€κ°’μ— 1을 λ”ν•œ 값을 μ‚¬μš©ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 이λ₯Ό 톡해 λ‹€μŒμ— μ‚½μž…λ  값인 11을 μ˜ˆμΈ‘ν•˜κ³  μƒˆλ‘œμš΄ 데이터λ₯Ό μ‚½μž…ν•  수 있게 λ©λ‹ˆλ‹€.

λ‹€λ§Œ, 이 방법은 λ™μ‹œμ— μ—¬λŸ¬ μ‚¬μš©μžκ°€ λ™μ‹œμ— INSERT 문을 μ‹€ν–‰ν•  κ²½μš°μ—λŠ” λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. 두 개 μ΄μƒμ˜ μ‚¬μš©μžκ°€ λ™μ‹œμ— μ΅œλŒ€κ°’μ„ μ°Ύκ³ , κ·Έ 값을 기반으둜 INSERT 문을 μ‹€ν–‰ν•˜λ € ν•  λ•Œ, λ‘˜ μ΄μƒμ˜ μ‚¬μš©μžκ°€ λ™μΌν•œ 값을 기반으둜 μ‚½μž…ν•˜κ²Œ 될 수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ‹€λ₯Έ 방법을 μ‚¬μš©ν•΄μ•Ό ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ‹œν€€μŠ€λ‚˜ 트리거λ₯Ό μ‚¬μš©ν•˜μ—¬ κ³ μœ ν•œ 값을 μƒμ„±ν•˜κ³  이λ₯Ό μžλ™μ¦κ°€ μ»¬λŸΌμ— μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

5. κ²°λ‘ 

μžλ™μ¦κ°€ 컬럼의 μ΅œλŒ€κ°’μ„ μ°Ύκ³ , κ·Έ 값을 기반으둜 λ‹€μŒμ— μ‚½μž…λ  값에 λŒ€ν•œ μ˜ˆμΈ‘μ„ ν•˜λŠ” 것은 맀우 μœ μš©ν•œ μž‘μ—…μž…λ‹ˆλ‹€. 이λ₯Ό 톡해 λ°μ΄ν„°λ² μ΄μŠ€μ— κ³ μœ ν•œ 값을 μžλ™μœΌλ‘œ μƒμ„±ν•˜μ—¬ 쀑볡을 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.

μžλ™μ¦κ°€ 컬럼의 μ΅œλŒ€κ°’μ€ MAX() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•˜μ—¬ μ‰½κ²Œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, SELECT MAX(id) FROM my_table 같은 ν˜•νƒœλ‘œ 쿼리λ₯Ό μž‘μ„±ν•˜λ©΄ ν•΄λ‹Ή ν…Œμ΄λΈ”μ˜ μžλ™μ¦κ°€ 컬럼인 id의 μ΅œλŒ€κ°’μ„ 얻을 수 μžˆμŠ΅λ‹ˆλ‹€.

λ˜ν•œ, λ‹€μŒμ— μ‚½μž…λ  값은 μ΅œλŒ€κ°’μ— 1을 λ”ν•œ κ°’μœΌλ‘œ μ˜ˆμΈ‘ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ, μƒˆλ‘œμš΄ 데이터λ₯Ό μ‚½μž…ν•  λ•Œμ—λŠ” (SELECT MAX(id) + 1 FROM my_table)와 같은 ν˜•νƒœλ‘œ 값을 μ„€μ •ν•˜λ©΄ λ©λ‹ˆλ‹€.

ν•˜μ§€λ§Œ, λ™μ‹œμ— μ—¬λŸ¬ μ‚¬μš©μžκ°€ λ™μΌν•œ λ°©μ‹μœΌλ‘œ μ΅œλŒ€κ°’μ„ μ°Ύκ³ , κ·Έ 값을 기반으둜 INSERT 문을 μ‹€ν–‰ν•  경우 λ¬Έμ œκ°€ λ°œμƒν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ‹€λ₯Έ 방법을 κ³ λ €ν•΄μ•Ό ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ‹œν€€μŠ€λ‚˜ 트리거λ₯Ό μ‚¬μš©ν•˜μ—¬ κ³ μœ ν•œ 값을 μƒμ„±ν•˜κ³ , 이λ₯Ό μžλ™μ¦κ°€ μ»¬λŸΌμ— μ μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μžλ™μ¦κ°€ 컬럼의 μ΅œλŒ€κ°’μ„ μ°Ύκ³ , μ μ ˆν•œ κ°’μœΌλ‘œ λ‹€μŒμ— μ‚½μž…λ  데이터λ₯Ό μ˜ˆμΈ‘ν•˜λŠ” 것은 λ°μ΄ν„°λ² μ΄μŠ€ μž‘μ—…μ—μ„œ 맀우 μœ μš©ν•œ κΈ°λŠ₯μž…λ‹ˆλ‹€. 이λ₯Ό 톡해 λ°μ΄ν„°μ˜ 정합성을 μœ μ§€ν•˜κ³ , 쀑볡을 방지할 수 μžˆμŠ΅λ‹ˆλ‹€.

λŒ“κΈ€