database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
ㆍSybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Sybase Q&A 1344 게시물 읽기
No. 1344
insert시 seq 중복 에러..
작성자
김기택
작성일
2005-10-26 09:53ⓒ
2005-10-26 09:58ⓜ
조회수
4,732

안녕하세요..

요즘들어 질문을 자주 올리네요.. ㅠㅠ

 

어떤 테이블이 하나 있는데요.

테이블 생성할때 키설정 안해주면 자동으로 키로 만들도록 seq 라는 일련번호(?)컬럼을 만들도록하고 거기에 키를 설정하게 되는거 있잖아요..

그렇게 생성되서 사용하고 있는 테이블이 하나 있는데..

insert 쿼리 보낼때 seq 부분은 생략하고 쿼리 보내잖아요. 그러면 자동으로 알아서 seq에 숫자 정해져서 들어가게 되있는데..

그게 insert시 중복에러가 나네요.. ㅠㅠ

트리거를 통해 insert 되는거라 seq를 임의로 보내는것도 그렇고..

서버를 재부팅하고 다시 insert 해보면 또 몇번은 이상없이 잘 들어가네요.. ㅠㅠ

왜 이런 현상이 일어나는건지 해결방법을 알고 싶습니다...

 

 

아.. 그리고 밑에밑에 제 질문에 답변 해주셨던 존넘님 감사드리고요..

그방법으로는 해결이 안되네요.. 밑에 다시 댓글을 달아놓았으니 한번더 도와주시면 감사드리겠습니다.

 

항상 도움만 많이 받고 가네요... 언젠간 저도 답글을 달아 줄수 있을때가 올까요... ^^;;

그럼 좋은하루 되세요~

이 글에 대한 댓글이 총 2건 있습니다.

테이블에 PK 컬럼이 의미있는 컬럼이 아니라면,

굳이 PK를 지정하지 않아도 됩니다.

 

일련번호라는 컬럼을 꼭 만들어야 할까요?

일련번호를 의미있게 활용할 이유가 없다면 PK가 없는

테이블로 활용하셔도 될듯 합니다.

 

일련번호가 아닌 임의의 숫자로 할 수도 있습니다.

rand() 함수를 이용하는 것입니다.

 

사용 예,

create table t1  (k int unique, ....)

insert t1 values (rand()*1000, ....)
insert t1 values (rand()*1000, ....)
insert t1 values (rand()*1000, ....)

 

 

또 하나는 newid()하는 함수입니다.

create table t2  (k varchar(36) unique, ....)
insert t2 values (newid(), ....)
insert t2 values (newid(), ....)
insert t2 values (newid(), ....)

두개의 테이블 다 k 라는 컬럼을 unique로 PK로 하는 예제입니다.

 

 

일련번호를 굳이 이용하시겠다면,

트리거보다는 입력용 프로시저를 만드시는 것이 좋겠습니다.

 

create proc PROC_TEST_INSERT
(
@col1 char(10), @col2 int
)
as

declare @max int

select @max = isnull(max(seq_no),0)+ 1 from 테이블

insert into 테이블
(seq_no, col1, col2)
values (@max, @col1, @col2)

return
go

grant execute on PROC_TEST_INSERT to public
go

 

-- 데이터 입력시
1> exec PROC_TEST_INSERT 'RICH', 100
2> go
1> exec PROC_TEST_INSERT 'RICH', 200
2> go

-- 조회
1> select * from 테이블

존넘님이 2005-10-26 11:42에 작성한 댓글입니다.
이 댓글은 2005-10-26 13:58에 마지막으로 수정되었습니다. Edit

rand()함수를 이용한 unique 컬럼을 PK로 활용하기

 

create table t (
seq_no int default (rand()*100000) unique not null,
a char(10) null
)
go

 

insert into t (a) values ('AAAAAAA')
insert into t (a) values ('BBBBBBB')
insert into t (a) values ('CCCCCCC')

go

 

select * from t
go

 

 seq_no      a         
 ----------- ----------
       30166 AAAAAAA   
       94941 BBBBBBB   
       16500 CCCCCCC   

(3 rows affected)

존넘님이 2005-10-26 14:00에 작성한 댓글입니다.
이 댓글은 2005-10-26 14:02에 마지막으로 수정되었습니다. Edit
[Top]
No.
제목
작성자
작성일
조회
1347declare local temporary table index 오류 [3]
답답해
2005-10-28
3660
1346세션 kill [2]
초보
2005-10-28
7551
1345for xml 사용시 한글문제
김지수
2005-10-26
3174
1344insert시 seq 중복 에러.. [2]
김기택
2005-10-26
4732
1343오라클의 pro*c 처럼... [1]
새내기
2005-10-20
4111
1342백업시 질문있습니다. [7]
김기택
2005-10-20
4543
1341테이블 restore 시의 에러 [1]
썩은나무
2005-10-19
3700
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다