하나의 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');
-- // 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 번호를 가져올 수 없는 문제점이 있다.
함수든 쿼리든 실행해서 다음 시퀀스 값을 읽어와서
그 값을 다른 INSERT문장이나 UPDATE 문장에서 사용하는 형태가 최적으로 보인다.
댓글 없음:
댓글 쓰기