2010년 12월 25일 토요일

MySQL에서 시퀀스(Sequence) 흉내내기


하나의 Sequence 값만 필요한 경우 
-- // 1. MySQL sequence emulator 테이블 준비

CREATE TABLE id_generator (seq_currval BIGINT NOT NULL) ENGINE=MyISAM;
INSERT INTO id_generator VALUES (0);

-- // 2. Next sequence id 생성
UPDATE id_generator SET seq_currval=LAST_INSERT_ID(seq_currval+1);

-- // 3. 생성된 Id 가져오기
SELECT LAST_INSERT_ID();
또는
insert into datatable(fdkey, fd1) values (LAST_INSERT_ID(), '1st');


여러 개의 Sequence 값이 필요한 경우 
-- // 1. MySQL sequence emulator 테이블 준비
CREATE TABLE id_generator (
  seq_name CHAR(1) NOT NULL COLLATE latin1_general_cs,
  seq_currval BIGINT UNSIGNED NOT NULL,
  PRIMARY KEY (seq_name)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

INSERT INTO id_generator (seq_name, seq_currval) VALUES (‘B’,0); -- // Board Id
INSERT INTO id_generator (seq_name, seq_currval) VALUES (‘D’,0); -- // Document Id
INSERT INTO id_generator (seq_name, seq_currval) VALUES (‘C’,0); -- // Comment Id

-- // 2. Next sequence id 생성
UPDATE id_generator SET seq_currval=LAST_INSERT_ID(seq_currval+1) WHERE seq_name=’B’;
UPDATE id_generator SET seq_currval=LAST_INSERT_ID(seq_currval+1) WHERE seq_name=’D’;
UPDATE id_generator SET seq_currval=LAST_INSERT_ID(seq_currval+1) WHERE seq_name=’C’;

-- // 3. 생성된 Sequence Id 가져오기
SELECT LAST_INSERT_ID();
또는
INSERT INTO board (board_id, board_name) VALUES (LAST_INSERT_ID(), ‘ThemeBoard’);

위 내용들은 쉽게 함수화해서 사용할 수 있다.
하지만, MySQL 의 Stored Function의 한계로 인해서
함수 내부에서는 설정된 변수는 함수 외부에서 접근이 안되어서, LAST_INSERT_ID()로
채번된 Id 번호를 가져올 수 없는 문제점이 있다.

현재 MySQL에서 가장 적절한 방법은
함수든 쿼리든 실행해서 다음 시퀀스 값을 읽어와서
그 값을 다른 INSERT문장이나 UPDATE 문장에서 사용하는 형태가 최적으로 보인다.

댓글 없음:

댓글 쓰기