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 1354 게시물 읽기
No. 1354
Pk 정보가 옆에 함께 나올려면 어떻게 해야 하나요?
작성자
밍호
작성일
2005-11-03 11:57
조회수
5,903

DB의 테이블에 관련된 기본정보는 아래의 쿼리를 통해서 가져왔습니다.

여기에 Pk 여부만 체크되어서 함께 갖고 올려면 어떻게 해야하는지요?

 

null 체크는 case를 사용해서 붙였는데 컬럼별 Pk 여부는 체크를 못하겠습니다.

===========================================================

select a.name, b.name, c.name,
b.length,
b.prec, b.scale, b.status,
case when b.status = 8 then '' else 'Y' end
from sysobjects a, syscolumns b, systypes c
where a.id = b.id and b.usertype = c.usertype
and a.type = 'U'
order by a.name, b.colid

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

ASE에서는 sp_primarykey 라는 명령에 의해

테이블의 PKey 정보를 등록할 수 있습니다.

 

이것은 Key 정의만을 저장하는 것이지,

실제로 PK로써의 제약을 체크하는 기능을 제공하지는 않습니다.

 

DB 모델링시 PK 정보를 남기는 좋은 습관을 갖는 것이 좋습니다.

 

질문하신 내용에 대한 전제조건이 있음을 먼저 말씀드린 것입니다.

 

다음과 같이 syskeys 테이블과 조인하여

PK여부를 나타낼 수 있습니다.

syskeys 테이블을 보시면 key1~key8까지의 컬럼이 있습니다.

key가 8개가 넘을 경우에는 8개까지만 저장이 되는군요.

sp_helpkey를 했을 때 8개의 컬럼리스트만 나옵니다.

 

다음과 같은 퀴리를 사용하시면

sp_primarykey로 선언되고, PK컬럼이 8개 이내인 경우

원하시는 결과를 얻을 수 있습니다.

 

select
a.name as Table_name,
b.colid as Column_id,
b.name as Column_name,
c.name as DataType,
b.length,
b.prec, b.scale, b.status,
case when b.status = 8 then '' else 'Y' end as "Not Null",
case when
  (b.colid = d.key1
  or b.colid = d.key2
  or b.colid = d.key3
  or b.colid = d.key4
  or b.colid = d.key5
  or b.colid = d.key6
  or b.colid = d.key7
  or b.colid = d.key8) then 'Y'
  else ''
end as "PKey"
from sysobjects a, syscolumns b, systypes c, syskeys d
where
  a.id = b.id and b.usertype = c.usertype
and a.type = 'U'
and a.id *= d.id
and d.type = 1
order by a.name, b.colid

 

테이블을 만들때 create table에 primary key constraint를 추가하면

실제로 PK 인덱스가 생성이 됩니다.

그러나 syskeys 테이블에는 아무런 정보도 기록하지 않습니다.

따라서 create table로 테이블을 생성하실때에도

sp_primarykey를 함께 정의해 주면

보다 테이블의 정보를 정확하게 관리할 수 있게 됩니다.

 

다음은 테스트해본 것입니다.

 

create table t
(
c01 char(1) not null,
c02 char(1) not null,
c03 char(1) not null,
c04 char(1) not null,
c05 char(1) not null,
c06 char(1) not null,
c07 char(1) not null,
c08 char(1) not null,
c09 char(1) not null,
c10 char(1) not null,
c11 int null,

primary key (c01,c02,c03,c04,c05,c06,c07,c08,c09,c10)
)

 

1> sp_helpkey t

--> No defined keys for this object.

 

1> sp_primarykey t, c01,c02,c03,c04,c05,c06,c07,c08,c09,c10
-->

keytype    object                         related_object                 object_keys                                                            related_keys                                                          
---------- ------------------------------ ------------------------------ ---------------------------------------------------------------------- ----------------------------------------------------------------------
primary    t                               -- none --                    c01, c02, c03, c04, c05, c06, c07, c08                                 *, *, *, *, *, *, *, *                                                
 
1 Row(s) affected

1>select
a.name as Table_name,
b.colid as Column_id,
b.name as Column_name,
c.name as DataType,
b.length,
b.prec, b.scale, b.status,
case when b.status = 8 then '' else 'Y' end as "Not Null",
case when
  (b.colid = d.key1
  or b.colid = d.key2
  or b.colid = d.key3
  or b.colid = d.key4
  or b.colid = d.key5
  or b.colid = d.key6
  or b.colid = d.key7
  or b.colid = d.key8) then 'Y'
  else ''
end as "PKey"
from sysobjects a, syscolumns b, systypes c, syskeys d
where
a.id = object_id('t')
and a.id = b.id and b.usertype = c.usertype
and a.type = 'U'
and a.id *= d.id
and d.type = 1
order by a.name, b.colid

 

-->

Table_name                     Column_id Column_name                    DataType                       length      prec scale status Not Null PKey
------------------------------ --------- ------------------------------ ------------------------------ ----------- ---- ----- ------ -------- ----
t                              1         c01                            char                           1           NULL NULL  0      Y        Y   
t                              2         c02                            char                           1           NULL NULL  0      Y        Y   
t                              3         c03                            char                           1           NULL NULL  0      Y        Y   
t                              4         c04                            char                           1           NULL NULL  0      Y        Y   
t                              5         c05                            char                           1           NULL NULL  0      Y        Y   
t                              6         c06                            char                           1           NULL NULL  0      Y        Y   
t                              7         c07                            char                           1           NULL NULL  0      Y        Y   
t                              8         c08                            char                           1           NULL NULL  0      Y        Y   
t                              9         c09                            char                           1           NULL NULL  0      Y            
t                              10        c10                            char                           1           NULL NULL  0      Y            
t                              11        c11                            int                            4           NULL NULL  8                   
 
11 Row(s) affected

 

이것은 PK 컬럼을 10개를 만들어서 확인해 본 것입니다.

역시나 8개 컬럼까지만 PK로 표시되는 오류가 있습니다.

 

가장 좋은 방법은 sp_help로 테이블의 상세 정보를 보는 것 같습니다.

 

정리하면,

모든 테이블에 sp_primarykey로 PK 정의가 되어 있으며,

PK 컬럼의 수가 8개 이내인 경우에는

제시한 쿼리로 테이블의 정보를 얻을 수 있을 것입니다.

 

 

존넘님이 2005-11-03 17:29에 작성한 댓글입니다. Edit

존넘님 정말 감사합니다.

장문의 내용에 테스트 까지...

나는 언제 저렇게 될려나...

 

흐흑..왜우리는 primary key constraint를 만들지 않았을까

후회해 봅니다.

다시한번 감사드립니다.

 

밍호님이 2005-11-03 18:15에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
1357group by후 outer join 하려면? [2]
김운희
2005-11-04
5509
1356foreign Key 지정방법 [1]
지니
2005-11-04
3336
1355DB START ERROR [2]
김충관
2005-11-03
3103
1354Pk 정보가 옆에 함께 나올려면 어떻게 해야 하나요? [2]
밍호
2005-11-03
5903
1351load 관련 문의 입니다. [2]
경호선
2005-11-01
3800
1350ASA 평가판의 최대 접속자수는 어떻게 되나요? [1]
사이베이스
2005-11-01
3620
1349sybase ansi 버전
김충관
2005-11-01
3274
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.018초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다