seg 님이 쓰신 글 :
: 안녕하세요
: DB (Interbase) 프로그래밍을 할 때 key 값을 계속 1씩 증가시키는 걸 하려고 합니다.
:
: 전체적인 로직은 다음과 같습니다. SQL문을 사용해 기존의 최대값을 뽑아서 1을 더해 저장하려는 것인데요,
:
:
: with ibq1 do begin
: sql := 'select Max(idvalue) from AnyTable where dept=1';
: Open;
:
: a := Fields[0].Asinteger + 1;
:
: SQL.Text := format('insert into AnyTable (idvalue) values (%d)', [a]);
: ExecSQL;
: end;
:
: 그런데 이런 식으로 할 경우 이 두 SQL 문장이 실행되는 도중에 딴 record 가 입력이 되면, idvalue 가 중복이 되는 사태가 벌어질 수 있을 것 같습니다.
:
: 그래서 Interbase 의 stored procedure 로 작성하면 되는 것인지 알고 싶습니다.
:
:
: select max(idvalue) from anytable where dept=1 into :imax;
: insert into anytable (idvalue) values (:imax+1);
:
: 처럼 말이죠.
:
:
: 그런데 stored procedure 의 경우에도 이 두 개의 SQL 문장 사이에 다시 stored procedure가 호출되면, 같은 idvalue가 생성되거나 할 가능성이 없는지요.
:
: 또 이런 경우 보통 어떻게 해결하는지.. 테이블 전체에 해당되는 것이 아니라, 위에서 보시듯 dept 등 각 조건에 따라 1부터 차례로 값을 주고자 합니다.
위처럼 해도 충분히 문제 없다고 생각합니다.
[입력]버튼을 누루는 순간에 저 로직을 탄다면 충분히 가능 하겠는데요...
where dep t= '1' 요 구문이 있으니..키 값중에 dept도 포함되어 있는듯 합니다.
그러므로 더욱 가능합니다..ㅎㅎ
키 값이 부서, 일련번호 이렇다면 그 부서에 몇명의 유저가 동시 입력을 하는지 모르지만..뭐 그렇더라도
대부분은 처리 가능합니다.
그래도 미덥지 못하다면..별도 키값 테이블을 만들어서 입력과 동시에 먼저 그 키값 데이블에 키값을 생성하고
(생성하지 못하면 다음으로넘어가지 못하게 하고..)
생성된 키 값을 입력하고자 하는 테이블에 사용하면 될겁니다...
|