FireBird Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
파이어버드 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
IBPhoenix
FireBird Main site
볼랜드포럼 광고 모집

FireBird Q&A
[3387] Re:파이어버드 2.0 자동증가문제
letsgolee [] 3216 읽음    2010-03-13 14:04
firebird 2.0을 쓰시니 sequence로 답변을 드려볼께요.
저도 firebird를 쓰기 시작하면서 힘들었던 부분이라...

sequence 생성:
create sequence sq_db_table;


insert 할 때 문법:
(만일 num을 sequence로 쓰고자 할 때...)
insert into db_table (num, datetime, id, temp, lumi, humi) values (NEXT VALUE FOR sq_db_table, .....)
이런 식으로 입력하면 됩니다. 만일 next value for가 아니라 일반적으로 하듯 null값을 입력하면 자동으로 입력되게 하려면 trigger를 써야 합니다. 그건 아래 generator할 때 설명을 할께요.

generator에 대한 문법은 다음과 같습니다.
생성:
create generator gen_db_table;


만일 generator값을 변경하고자 할 때:
set generator gen_db_table to 0;

그런데 기본적으로 0값이므로 특정하게 바꾸고자 할 때 값을 적으면 됩니다. sequence의 문법은
alter sequence sq_db_table restart with 1;
이렇게 하면 1값에서부터 다시 시작합니다.

트리거 생성:
트리거 생성시 주의할 점은 terminal 기호입니다. sql의 terminal 기호는 ';'인데 문제는 트리거 문법을 쓰다보면 이 터미널 기호가 중간에 들어가는데 구문을 돌리다가 여기서 에러가 발생하는 경우가 생깁니다. 그래서 터미널 기호를 바꾸어주어야 합니다. set term으로 터미널 기호를 ^로 바꾸었다가 트리거 문법이 끝나면 다시 ;로 바꾸는 거죠.

set term ^;
CREATE  TRIGGER  trg_db_table FOR db_table
BEFORE  INSERT  AS
BEGIN
    if (NEW.num is null) then NEW.num = GEN_ID(gen_db_table, 1);
END^
set term ;^


squence를 쓰는 경우는 gen_id(gen_db_table, 1)대신에
next value for sq_db_table
을 적으면 됩니다.



미미야 님이 쓰신 글 :
: 며칠을 삽질했습니다. 도와주십시오.
:
:
: create table db_table (
: num integer not null,
: datetime varchar(30) not null,
: id varchar(5) not null,
: temp varchar(5) not null,
: lumi varchar(5) not null,
: humi varchar(5) not null
: );
: 이렇게 테이블을 만들고 자동증가를 위해 처음에 검색하여
:
: CREATE GENERATOR no_gen;
:
: SET     GENERATOR   no_gen TO  0;
:
: CREATE  TRIGGER  no_trg FOR db_table
: BEFORE  INSERT  AS
: BEGIN   
:     NEW.num = GEN_ID(no_gen, 1);
: END;
:
: 이런식으로 하니
: CREATE GENERATOR no_gen;
: 부터 에러뜹니다.
: statement 에러라고라.. -607 에러네요..
: 제너레이터가 정의가 안되어 있다.. 뭐이런..
: 암튼 그래서 sequence로 바꾸어 보려고 합니다.
:
:
: 어디서 찾아서리
: 1. CREATE SEQUENCE no_seq;
:
: 2. SELECT NEXT VALUE FOR no_seq FROM db_table;
:
: CREATE TRIGGER no_trg
: FOR db_table ACTIVE BEFORE INSERT POSITION 0 AS
: BEGIN
:    IF (NEW.num IS NULL) THEN NEW.num = NEXT VALUE
:    FOR no_seq
: END;
: 를 하면 end가 잘못되었다고 104번 에러를 냅니다...
: 아 미치겠습니다..
:
: 다시 하니까 또 저 첫줄 1번부터 안된다고 나오네요.. 제발 좀 도와 주십시오...
: 테이블 구조는 위와 같고 num을 insert 할때마다 1씩 자동증가 하게끔 하고 싶습니다....
: 제대로된 문장을 제발 부탁드립니다..

+ -

관련 글 리스트
3360 파이어버드 2.0 자동증가문제 미미야 2792 2010/02/02
3387     Re:파이어버드 2.0 자동증가문제 letsgolee 3216 2010/03/13
3362     Re:파이어버드 2.0 자동증가문제 까막.윤창희 2772 2010/02/03
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.