제약조건 질문드립니다 0 4 1,174

by 퍼품디올 [SQL Query] 제약조건 FK PK 참조테이블 [2018.08.27 18:01:17]


안녕하세요

부모-자식테이블 간의 제약조건을 알고 싶습니다. 

예를들면.. 

참조테이블(부모)  |    자식테이블(자식)

테이블명 | 컬럼명 |    테이블명 | 컬럼명

 

자식테이블 어떤 테이블-컬럼들이 부모테이블 어떤 테이블-컬럼들을 참조하고 있는지 구하고 싶은데 user_constraints , user_cons_columns 테이블들로 

만들어 내지를 못하고 있습니다.

도움부탁드립니다. 

감사합니다 

 

 

 

by 거제도원주민 [2018.08.27 21:58:39]

질문에 대한 답변은 아닐런지 모르겠네요....

[오라클 데이타베이스]

참조하는가

참조 당하는가로 분류해 볼 수 있겠네요

아래 쿼리 2개를 활용해 보세요

1.나를 어느 테이블에서 참조하고 있는지

 SELECT *
FROM   (SELECT REF_TBL.CONSTRAINT_NAME CNST_NAME,
               IND_COL.COLUMN_NAME,
               IND_COL.COLUMN_POSITION COL_PSTN,
               FOR_TBL.TABLE_NAME
        FROM   SYS.ALL_CONSTRAINTS FOR_TBL,
               SYS.ALL_CONSTRAINTS REF_TBL,
               SYS.ALL_IND_COLUMNS IND_COL
        WHERE  FOR_TBL.OWNER = 'CNSONE'              //---------오너명
               AND FOR_TBL.TABLE_NAME = 'PI200M'      //----------테이블명
               AND FOR_TBL.CONSTRAINT_TYPE = 'P'
               AND FOR_TBL.OWNER = REF_TBL.R_OWNER
               AND FOR_TBL.CONSTRAINT_NAME = REF_TBL.R_CONSTRAINT_NAME
               AND FOR_TBL.OWNER = IND_COL.TABLE_OWNER
               AND FOR_TBL.TABLE_NAME = IND_COL.TABLE_NAME
               AND FOR_TBL.CONSTRAINT_NAME = IND_COL.INDEX_NAME)
WHERE  1 = 1
ORDER  BY CNST_NAME ASC,
          COL_PSTN ASC

2.내가  어느테이블을 참조하고 있는지 확인

SELECT *
FROM   (SELECT FORTBL.CONSTRAINT_NAME CNST_NAME,
               IDXTBL.COLUMN_NAME,
               IDXTBL.COLUMN_POSITION COL_PSTN,
               REFTBL.TABLE_NAME
        FROM   SYS.ALL_CONSTRAINTS FORTBL,
               SYS.ALL_CONSTRAINTS REFTBL,
               SYS.ALL_IND_COLUMNS IDXTBL
        WHERE  FORTBL.OWNER = 'CNSONE'       //------------오너명
               AND FORTBL.TABLE_NAME = 'PI200M'  //----------테이블명
               AND FORTBL.CONSTRAINT_TYPE = 'R'
               AND REFTBL.CONSTRAINT_TYPE = 'P'
               AND REFTBL.OWNER = FORTBL.R_OWNER
               AND REFTBL.CONSTRAINT_NAME = FORTBL.R_CONSTRAINT_NAME
               AND IDXTBL.INDEX_OWNER = REFTBL.OWNER
               AND IDXTBL.INDEX_NAME = REFTBL.INDEX_NAME)
WHERE  1 = 1
ORDER  BY CNST_NAME ASC,
          COL_PSTN ASC

 


by 우리집아찌 [2018.08.28 08:57:46]

FK 안걸려있으면 모릅니다.


by 마농 [2018.08.28 15:18:15]
SELECT PRIOR a.owner           fk_owner
     , PRIOR a.constraint_name fk_constraint_name
     , PRIOR a.table_name      fk_table_name
     , PRIOR b.column_name     fk_column_name
     , a.owner                 pk_owner
     , a.constraint_name       pk_constraint_name
     , a.table_name            pk_table_name
     , b.column_name           pk_column_name
  FROM user_constraints a
     , (SELECT owner, constraint_name
             , LISTAGG(column_name, ',') WITHIN GROUP(ORDER BY position) column_name
          FROM user_cons_columns
         GROUP BY owner, constraint_name
        ) b
 WHERE a.owner = b.owner
   AND a.constraint_name = b.constraint_name
   AND CONNECT_BY_ISLEAF = 1
 START WITH a.constraint_type = 'R'
 CONNECT BY PRIOR a.r_owner = a.owner
        AND PRIOR a.r_constraint_name = a.constraint_name
;

 


by 퍼품디올 [2018.08.29 18:00:20]

감사합니다.

답답했던 속이 뻥 뚫렸네요 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입