반응형
- 나의 상황
: 현재 진행하는 프로젝트에서 특정 테이블들의 키 컬럼은 auto_increment 를 설정할 수 없어 sequence 기능을 사용하기 위해 찾아보게 되었다.
우선 mysql 은 oracle 과 다르게 시퀀스 기능을 별도로 제공하지 않아서.. 이것저것 직접 설정해줘야 했다.
- 설정
1. 시퀀스를 사용할 테이블 생성
CREATE TABLE sequences (NAME VARCHAR(32), CURRVAL BIGINT UNSIGNED) ENGINE = InnoDB
2. 시퀀스를 생성 할 프로시저 생성
DELIMITER $$
CREATE PROCEDURE `create_sequence` (IN the_name text)
MODIFIESSQL DATA
DETERMINISTIC
BEGIN
DELETE FROM sequences WHERE name = the_name;
INSERT INTO sequences VALUES(the_name, 0);
END
// 받은 시퀀스명으로 시퀀스가 이미 생성되어 있다면, 지우고 새로 생성
3. 생성 한 시퀀스의 다음 값을 가져오는 함수 'nextval' 생성
DELIMITER $$
CREATE FUNCTION `nextval`(the_name VARCHAR(32))
RETURNS BIGINT UNSIGNED
MODIFIES SQL DATA
DETERMINISTIC
BEGIN
DECLARE ret BIGINT UNSIGNED;
UPDATE sequences SET currval = currval +1 WHERE name = the_name;
SELECT currval INTO ret FROM sequences WHERE name = the_name LIMIT 1;
RETURN ret;
END
여기까지 하고 나면 위와 같이 sequences 테이블과 Procedurse 에 create_sequence, nextval 이 생성된 것을 확인할 수 있다.
- 사용
1. 시퀀스 컬럼 생성
call create_sequence('TEST_SEQ');
* 만약 이미 TEST_SEQ 가 존재하는데 생성요청을 하면, currval가 0으로 초기화되므로 주의하자!
2. nextval 호출 (호출하는 순간 +1 됨!)
select nextval('TEST_SEQ') from dual;
3. 활용
INSERT INTO TEST_TABLE
(TEST_SEQ, COL_1, COL_2)
VALUES
( select nextval('TEST_SEQ') as TEST_SEQ from dual, 'col1Val', 'col2Val')
완전 참고한 출처!
반응형
'개발 > DB' 카테고리의 다른 글
[MySQL] on duplicate key update (키 값 여부에 따른 insert / update) (2) | 2023.02.02 |
---|---|
[MyBatis] Insert 후 Key 값 받아오기 (selectKey) (1) | 2022.11.03 |
[MySQL] not exists, exists 사용하여 insert/update 하기. (0) | 2022.10.26 |
intelliJ 에서 springboot + cubrid 연결 시 만난 에러 : java.lang.UnsupportedOperationException] with root cause (1) | 2022.07.26 |
MyBatis 대량 데이터 INSERT - SqlSessionFactory 이용! (2) | 2022.04.07 |