본문 바로가기
SQL

[DB] 키 값, 유일한 값, 고유한 값 만들기(Identity 값, MAX + 1, ROW_NUMBER())

by kkaboo 2023. 11. 3.
728x90

데이터베이스 테이블에 키 값이나 유일한 값을 넣을 때 사용하고 있는 방법들을 정리해보았다.

상황에 따라 더 효율적인 방법을 사용해야 하기때문에 긴가민가 할때에는 선배들에게 조언을 구한 뒤 사용한다.

개발 경험과 공부가 더 필요할 것 같다.

 

Identity 값

주로 primary key역할을 하는 컬럼에 할당되는 값으로 새로운 레코드가 추가될 때마다 자동으로 증가하는 고유한 값을 생성한다.

우리는 기본키로는 사용하지 않고, 그리드에 뿌려 특정 행을 잡을 때 사용한다.

DB마다 상이한 채번룰을 사용하는데 몇개의 예시를 들어보자면 아래와 같다.

MySQL

CREATE TABLE temp_table (
    ID INT AUTO_INCREMENT PRIMARY KEY
);

MSSQL

CREATE TABLE temp_table (
	SERIALKEY int IDENTITY(82,1) NOT NULL
);

PostgreSQL

CREATE TABLE temp_table (
    id SERIAL PRIMARY KEY
);

 

ROW_NUMBER()

테이블의 결과 집합에서 ORDER BY절에 의해 정렬된 순서를 기준으로 각 행에 순서를 할당해 고유한 값을 반환하는 함수이다.
ROW_NUMBER() 함수는 일반적으로 OVER() 절과 함께 사용된다.

SELECT
      ROW_NUMBER() OVER (PARTITION BY GROUP ORDER BY DATE) AS RANK
    , ID
    , NAME
  FROM TEMP_TABLE;

나는 MSSQL에서 아래와 같이 사용하고 있다.

ROW_NUMBER() OVER(ORDER BY (SELECT 1)) AS SERIALKEY

 

MAX + 1

MAX + 1은 해당 열의 최대값을 찾은 후 그 값에 1을 더하여 새로운 레코드를 삽입하는 방법이다.

댓글기능 또는 입력하는 데이터가 모두 동일 할 수 있는 경우(고유한 값 제외) 구분값이나 ORDER BY 용으로 사용하곤 한다. 나의 경우 단독 PK로 사용한 적은 아직 한번도 없었다.

아래는 데이터베이스별로 MAX + 1을 삽입하는 방법이다.

MySQL

SELECT 
      MAX(id) + 1 
 INTO @new_id 
 FROM temp_table;
 
INSERT 
  INTO temp_table (id, column1, column2) 
VALUES (@new_id, 'value1', 'value2');

MSSQL

 INSERT
      (  ID
       , LINE_NO )
 VALUES
      (  #{id}
       , (SELECT ISNULL(MAX(X.LINE_NO),0) + 1
		    FROM T_TEMP_TABLE X
		   WHERE 1 = 1
		     AND X.COLUMN1 = #{column1}
		     AND X.COLUMN2 = #{column2}
          )
       )

 

 

그 외에도 로직상으로 룰을 정해 특정한 값을 생성하는 방법 등 다양한 방법이 있을거라고 생각한다.

사용하고 있는 키생성 로직이 있는데 이 부분은 다음에 한번 정리 해 봐야겠다.

 

728x90