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