Constraint ( 제약조건 )

양혜정·2024년 3월 12일

Oracle

목록 보기
39/49

Primary key(기본키, 대표식별자) 제약 [ P ]

create table 테이블명
(컬럼명		유형		널
~~~~
, constraint 제약조건명 primary key(컬럼명)
);

Composite(복합) Primary Key

create table 테이블명
(컬럼명		유형		널
~~
, constraint 제약조건명 primary key(컬럼명1, 컬럼명2)
);

2. Unique 제약 [ U ]

  • column level 제약조건
create table 테이블명
(컬럼명		유형		널
~~
컬럼명		유형		unique -- column level 제약조건
);
  • row level 제약조건
create table 테이블명
(컬럼명		유형		널
~~
, constraint 제약조건명 unique(컬럼명)
);
  • Composite(복합) Unique Key
    => row level 제약조건으로 작성해야 한다!!!
create table 테이블명
(컬럼명		유형		널
~~
, constraint 제약조건명 unique(컬럼명1, 컬럼명2)
);

3. Foreign key ( 외래키 ) 제약 [ R ]

create table 테이블명
(컬럼명		유형		널
~~
, constraint 제약조건명 foreign key(컬럼명) 
	references 제약받을테이블명(제약받을 컬럼명)
);
  • On delete cascade
    -> "원글" 테이블에 어떤 한 행이 삭제가 되어지면 그 원글 행에 딸린 모든 댓글 또한 삭제가 되어야 하는 경우
create table 테이블명
(~~
, constraint 제약조건명 foreign_key(컬럼명) 
		references 부모테이블명(부모테이블컬럼명) on delete cascade
);
  • On delete cascade 주지 말아야 하는 경우

부서가 사라진다고 해도 사원이 사라지면 안되기 때문에
on delete cascade 주면 안된다.

  • On delete set null

    원글(부모) - 댓글(자식)
    자식테이블에 foreign key 에 해당하는 컬럼은 반드시 null 을 허락해주어야 한다.


4. Check 제약 [ C ]

create table 테이블명
(컬럼명		유형		널
~~
, constraint 제약조건명 check (조건)
);
  • 0 또는 1 값만 들어오게 하기
alter table 테이블명
add constraint 제약조건명 check(컬럼명 in(0,1));

- 제약조건 조회

-- Ex)
select A.table_name, A.constraint_name, A.constraint_type
, A.search_condition, B.column_name, B.position 
, A.r_constraint_name as 참조받는부모테이블의식별자제약조건명
from user_constraints A JOIN user_cons_columns B
ON A.constraint_name = B.constraint_name
where A.table_name = 'TBL_YEYAK' and A.constraint_type = 'R';
-- 제약조건 이름 R = FK

사용되고 있는 제약조건 모두, 제약조건 타입 확인

-> 복합제약조건이 있을 경우 하나의 constraint_name 으로 나온다.

select *
from user_constraints;

사용되고 있는 제약조건에 대한 내용

-> Ex) 테이블명, 컬럼명
-> 복합제약조건이 있을 경우 하나하나 컬럼별로 나온다.

select *
from user_cons_columns;

  • 컬럼명, 제약조건명
user_constraints 와 user_cons_columns JOIN 
조건절 ON : constraint_name 이 같은 경우 => 컬럼명, 제약조건명
  • 원하는 테이블이 같은 경우
user_constraints의 table_name (where)
  • 원하는 제약조건 타입
user_constraints 의 constraint_type 
-- (where 절 -> R : F.K  // C : Check, not null // 
-- P : P.K	//	U : Unique)

응용

  • F.K 컬럼명과 부모테이블명과 참조를 당하는 P.K(U.K)에 해당하는 컬럼명 조회
SELECT C.column_name as "외래키 컬럼명"
        , D.table_name as "부모테이블명"
        , D.column_name as "참조를 당하는 컬럼명"
FROM
(
    select B.column_name, A.r_constraint_name
    from user_constraints A JOIN user_cons_columns B
    ON A.constraint_name = B.constraint_name
   	where A.table_name = 'EMPLOYEES' and A.constraint_type = 'R' 
        								-- 제약조건 이름 R => FK
) C JOIN user_cons_columns D
ON C.r_constraint_name = D.constraint_name; 
/*
	-------------------------------------------------------------
    외래키 컬럼명		부모 테이블명		참조를 당하는 컬럼명
    -------------------------------------------------------------
    DEPARTMENT_ID		DEPARTMENTS			DEPARTMENT_ID
    JOB_ID				JOBS				JOB_ID
    MANAGER_ID			EMPLOYEES			EMPLOYEE_ID
*/
  • 테이블에 존재하는 foreign key 컬럼명과 부모테이블명과 참조를 당하는 primary key(unique key)에 해당하는 컬럼명을 조회
SELECT C.column_name as "외래키 컬럼명"
        , D.table_name as "부모테이블명"
        , D.column_name as "참조를 당하는 컬럼명"
        , C.delete_rule as "CASCADE 옵션"
FROM
(
    select B.column_name, A.r_constraint_name, A.delete_rule
    from user_constraints A JOIN user_cons_columns B
    ON A.constraint_name = B.constraint_name
    where A.table_name = 'EMPLOYEES' and A.constraint_type = 'R'    
    								-- 제약조건 이름 R => FK
) C JOIN user_cons_columns D
ON C.r_constraint_name = D.constraint_name;
/*
--------------------------------------------------------------------
외래키 컬럼명     부모테이블명      참조를 당하는 컬럼명     CASCADE 옵션
--------------------------------------------------------------------
DEPARTMENT_ID	DEPARTMENTS	      DEPARTMENT_ID	       NO ACTION
JOB_ID	           JOBS	            JOB_ID	           NO ACTION
MANAGER_ID	    EMPLOYEES	       EMPLOYEE_ID	       NO ACTION
*/

정리

-> local_hr에서작업한것

0개의 댓글