오라클에서 테이블에 대한 외부 키가 있는 테이블을 찾는 방법은 무엇입니까?
테이블에서 데이터를 삭제할 계획입니다. Oracle에서 이 특정 테이블에 대한 외부 키 참조가 있는 테이블의 수와 개수를 알고 싶습니다.외부 키를 null로 설정해야 하기 때문입니다.저는 이 특정 테이블에 대한 FK가 있는 모든 테이블의 목록을 알고 싶습니다.
SELECT
FK.OWNER||'.'||FK.TABLE_NAME AS CHILD_TABLE,
SRC.OWNER||'.'||SRC.TABLE_NAME AS PARENT_TABLE,
FK.CONSTRAINT_NAME AS FK_CONSTRAINT,
SRC.CONSTRAINT_NAME AS REFERENCED_CONSTRAINT
FROM ALL_CONSTRAINTS FK
JOIN ALL_CONSTRAINTS SRC ON FK.R_CONSTRAINT_NAME = SRC.CONSTRAINT_NAME
WHERE
FK.CONSTRAINT_TYPE = 'R'
AND SRC.OWNER = 'MY_SCHEMA'
AND SRC.TABLE_NAME = 'MY_TABLE';
연결하던 스키마에서 관심 있는 테이블이 소유하지 않는 상황이 발생했습니다.그래서 현재 승인된 답변의 쿼리를 수정해야 사용할 수 있습니다.ALL_CONSTRAINTS
대신에USER_CONSTRAINTS
그 과정에서 제가 실수를 했고, 합격된 답변은 제가 고칠 수 있도록 읽기가 매우 어렵다는 것을 알게 되었습니다. (설명이 부족해서 도움이 되지 않았습니다.)그 결과, 저는 저만의 질문을 하게 되었습니다.기본적으로 똑같지만, 조금 더 쉽게 더듬을 수 있을 것 같습니다.
FK.CONSTRAINT_TYPE = 'R'
필터 제거FK
외부 키 제약 조건 집합에 대해 조인은 이러한 외부 키를 "참조 제약 조건"과 쌍을 이룹니다(참조 제약 조건은 일반적으로 "상위" 테이블의 기본 키입니다).마지막으로 사용하고자 하는 상위 테이블로 필터링합니다.SRC.OWNER = 'MY_SCHEMA' AND SRC.TABLE_NAME = 'MY_TABLE'
.
자연스럽게 이 기능을 사용하도록 전환할 수 있습니다.USER_CONSTRAINTS
원한다면; 그냥 그것을 제거하세요.SRC.OWNER
체크 앤 더OWNER
의 접두사SELECT
.
SELECT d.table_name,
d.constraint_name "Primary Constraint Name",
b.constraint_name "Referenced Constraint Name"
FROM user_constraints d,
(SELECT c.constraint_name,
c.r_constraint_name,
c.table_name
FROM user_constraints c
WHERE table_name='EMPLOYEES' --your table name instead of EMPLOYEES
AND constraint_type='R') b
WHERE d.constraint_name=b.r_constraint_name
아래 쿼리는 TABLE_NAME에 정의된 모든 외부 키 제약 조건을 제공합니다.
select baseTable.* from all_constraints baseTable , all_constraints referentedTable
where baseTable.R_CONSTRAINT_NAME = referentedTable.CONSTRAINT_NAME
and baseTable.constraint_type = 'R'
and referentedTable.table_name = 'TABLE_NAME';
Walker가 질문한 내용을 잘못 이해했을 수도 있지만, 제가 이해한 것은 특정 테이블에 대한 외래 키 참조가 있는 테이블을 찾는 방법입니다(예: EMPAYS).
쿠파의 대답을 들어보면,
select d.table_name,
d.constraint_name "Primary Constraint Name",
b.constraint_name "Referenced Constraint Name"
from user_constraints d,
(select c.constraint_name,
c.r_constraint_name,
c.table_name
from user_constraints c
where table_name='EMPLOYEES' --your table name instead of EMPLOYEES
and constraint_type='R') b
where d.constraint_name=b.r_constraint_name
저는 직원들이 외래 키를 참조할 수 있는 표를 얻습니다.
EMPEMS.foreign_key => TABLES.primary_key
EMPEMS에 대한 외부 키 참조가 있는 테이블을 검색하려면 업데이트된 sql 아래를 참조하십시오.
TABLES.foreign_key => EMABLES.primary_key
select b.table_name "Table Name",
b.constraint_name "Constraint Name",
d.table_name "Referenced Table Name",
d.constraint_name "Referenced Constraint Name"
from user_constraints d,
(select c.constraint_name,
c.r_constraint_name,
c.table_name
from user_constraints c
where constraint_type='R') b
where d.table_name = 'EMPLOYEES' --your table name instead of EMPLOYEES
and b.r_constraint_name = d.constraint_name;
필드도 포함해야 하는 경우:
select b.table_name "Referencing Table",
b.CONSTRAINT_NAME "Referencing Constraint",
(select wm_concat(column_name)
from all_cons_columns
where owner = b.owner
and constraint_name = b.CONSTRAINT_NAME
) "Referencing Columns",
a.CONSTRAINT_NAME "Referenced Constraint",
(select wm_concat(column_name)
from all_cons_columns
where owner = a.owner
and constraint_name = a.CONSTRAINT_NAME
) "Referenced columns"
from all_constraints a,
all_constraints b
where a.owner = b.r_owner
and a.owner = '<<OWNER>>'
and a.table_name = '<<TABLE_NAME>>'
and a.constraint_type in ('P', 'U')
and b.constraint_type = 'R'
and b.R_CONSTRAINT_NAME = a.constraint_name
이 단계를 수동으로 수행할 필요는 없습니다. 단계적 삭제를 사용하면 됩니다.
SELECT a.table_name, a.column_name, a.constraint_name, c.owner,
-- referenced pk
c.r_owner, c_pk.table_name r_table_name, c_pk.constraint_name r_pk
FROM all_cons_columns a
JOIN all_constraints c ON a.owner = c.owner
AND a.constraint_name = c.constraint_name
JOIN all_constraints c_pk ON c.r_owner = c_pk.owner
AND c.r_constraint_name = c_pk.constraint_name
WHERE c.constraint_type = 'R'
AND a.table_name = :TableName
SELECT CONSTRAINT_NAME from ALL_CONSTRAINTS WHERE OWNER= sys_context('userenv','current_schema') AND CONSTRAINT_TYPE='R';
언급URL : https://stackoverflow.com/questions/3751932/how-to-find-tables-having-foreign-key-to-a-table-in-oracle
'programing' 카테고리의 다른 글
유형 스크립트 - Visual Studio 코드에서 모듈 'http'를 찾을 수 없습니다. (0) | 2023.06.26 |
---|---|
다음 중 MongoDB 필드 이름에 사용할 수 없는 문자는 무엇입니까? (0) | 2023.06.26 |
dplyr 요약:출력에서 길이가 0인 그룹을 유지하려면 ".drop=FALSE"와 같습니다. (0) | 2023.06.26 |
Oracle에서 사례 문장을 기반으로 Group By를 사용하는 방법은 무엇입니까? (0) | 2023.06.21 |
For 루프를 되돌리는 방법 (0) | 2023.06.21 |