안녕하세요...
SEQNO를 1부터 시작 하고 싶은데, <1번>처럼하면 210000001이렇게 SEQNO가 시작되어집니다.
이것을 그냥 1, 2, 3으로 변경하고 싶어< 2번>처럼 변경을 해보아도 여전희 210000001/ 210000002/ 210000003 -->이렇게 나타나고 있습니다.
좀 도와주세요!!
<insert id="insert" parameterClass="map">
1번)<!-- selectKey resultClass="String" keyProperty="SEQNO" type="pre">
SELECT NVL(MAX(SEQNO), TO_CHAR(SYSDATE, 'YY') || '000000') + 1 FROM TB_SAMPLE WHERE SEQNO LIKE TO_CHAR(SYSDATE, 'YY') || '%'
</selectKey-->
2번) <selectKey resultClass="String" keyProperty="SEQNO" type="pre">
SELECT NVL (MAX (SEQNO), 0) + 1 FROM TB_SAMPLE
</selectKey>
INSERT INTO TB_SAMPLE(
SEQNO
,TITLE
,TEXT
,REGDATE
,TESTDATE
)VALUES(
#SEQNO#
,#TITLE#
,#TEXT#
,#REGDATE#
,#TESTDATE#
)
</insert>
1. 중간에 삭제한 번호를 건너 뛰고 저장된다?
- 중간에 삭제한 번호를 건너 뛰고 저장되는게 아니라
- 순차적으로 저장된 상태에서 중간 번호가 삭제된 거겠죠.
2. 모든 자료 삭제 후에도 MAX 값이 20 이 나오나요?
- 그럴리가요?
- 뭔가 착각하고 계신게 아닐런지?
3. 지워진 자료까지 감안하여 빈틈 없이 매우려면?
- 지금 생각하고 있는 로직으로는 안됩니다.
- 삭제 시에 남은 값들을 다 업데이트 해야 하는데. 이러면 곤란합니다.
4. 생각의 전환이 필요할 듯 하네요.
- 저장 할 때 순차적으로 빈틈 없이 저장할 생각을 버리고
- 조회 할 때 원하는 대로 조회하세요.
- ROW_NUMBER() 이용
안녕하세요 마농님..
1. 순차적으로 저장된 상태에서 중간 삭제값을 건너뛰고 저장하는거네요...
2. 제가 잘못 알고 있었습니다.
3. 리스트에 보여지는게 순차적으로 보여지도록 하라고 --> 순차적으로 보여지는 방법으로 쿼리 작성을 해야만 했었는데, 이해력이 부족해서 첫단추를 잘못 채워진것 같습니다.
** 추가질문 **
기존테이블을 drop시키고 싶지만 잘못하면 안될것 같아(다른 소스 백업시키지않고 수정했다가 ㅠㅠㅠ)
truncate table TB_SAMPLE 한후
조건 쿼리문을 index를 이용해서 SELECT /*+INDEX_DESC(TABLE INDEX)*/SEQNO FROM TB_SAMPLE WHERE ROWNUM = 1
이런식으로 채번하는 방법을 사용해도 될까요?
감사합니다.~
1. 여전히 표현이 이상하네요...
- "순차적으로 저장된 상태에서 중간 삭제값을 건너뛰고 저장" 맞나요???
- "순차적으로 저장된 상태에서 중간 값을 삭제"가 맞는 것 같은데요?
2. 계속 그대로 사용할 테이블이라면?
- Drop 보다는 Truncate 가 맞습니다.
- 다만 기존 질문과 전혀 다르네요?
- 기존 질문에 기존자료가 남아 있을 것 같았는데? 기존 자료 다 삭제하네요?
- 그러면 조건절도 필요 없겠는데요?
3. INDEX 힌트 사용은
- 힌트 사용 및 ROWNUM 써도 되지만
- 위험성은 있습니다. 힌트에 오타가 난다거나, 인덱스가 제거된다거나?
- 그냥 MAX 해서 가져오면 됩니다.
- MAX 써도 성능은 동일하고 위험성은 없습니다.