풀스택 과정 day12_DBMS

정유섭·2022년 4월 21일
0

2022.4.21.(목)

CHECK

기본키( Primary key ) - PK

외래키( Foreign key ) - FK


0. CHECK

-- UNIQUE
CREATE TABLE UNIQUE_TEST2(
	col1	varchar2(20),
	col2	varchar2(20),
	CONSTRAINTS temp_unique2 UNIQUE(col1, col2)
); 

SELECT * FROM UNIQUE_TEST2 ;
	
INSERT INTO UNIQUE_TEST2 (col1, col2)
	VALUES ('aa', 'bb') ;

INSERT INTO UNIQUE_TEST2 (col1, col2)
	VALUES ('aa', 'cc') ;

INSERT INTO UNIQUE_TEST2 (col1, col2)
	VALUES ('aa', 'dd') ;

INSERT INTO UNIQUE_TEST2 (col1, col2)
	VALUES ('aa', 'ee') ;
-- check : 주어진 값만 허용하는 조건
CREATE TABLE check_test( 
	gender 	varchar2(10) NOT NULL 
	CONSTRAINTS check_gender CHECK (gender IN('남성', '여성'))
) ; 

SELECT * FROM CHECK_TEST ;

INSERT INTO CHECK_TEST VALUES ('남성') ;

INSERT INTO CHECK_TEST VALUES ('M') ;

UNIQUE와 CHECK의 사용

1. 기본키( Primary key ) - PK

- 기본키 역시 기본적인 제약 조건들을 테이블을 생성할 때 같이 정의한다.

- 테이블 당 하나만 정의 가능하다. (두 개 이상의 PK는 조합키 / 복합키 라고 불린다.
  묶어서 하나로 본다.)

- PK는 NOT NULL + UNIQUE의 기능을 가지고 있다.

- 자동으로 INDEX가 생성이 되는데, 이는 검색 키로써 검색 속도를 향상시킨다.

- 주키 / 기본키 / 식별자 / PK 등으로 불리고 있다.

1-1. PK 선언방법

CREATE TABLE testTable(
	col1	varchar2(10) primary key,

	col2 	varchar2(10) constraint PK제약조건이름 primary key,

	col3 	varchar2(10),
	constraint PK제약조건이름 primary key(col3)

) ;

alter table 테이블명 add constraint 제약조건명 primary key(컬럼명) ;

1-2. PK SQL 예시

-- PK

-- 인라인 방식
CREATE TABLE primary_key( 
	student_id	number(10) PRIMARY KEY ,
	name		varchar2(20)
);  

-- 아웃라인 방식
CREATE TABLE PRIMARY_KEY2( 
	student_id		number(10),
	name			varchar2(20),
	CONSTRAINTS student_pk PRIMARY KEY(student_id)
); 

-- 테이블 생성 후 기본키를 생성하는 방법
CREATE TABLE PRIMARY_KEY3(
	student_id		number(10),
	name			varchar2(20)
); 

ALTER TABLE PRIMARY_KEY3 
ADD CONSTRAINTS student_pk3 PRIMARY KEY(student_id) ;

2. 외래키( Foreign key ) - FK

- 외부키 / 외래키 / 참조키 / 외부 식별자 / FK로 불린다.

- FK가 정의된 테이블은 자식 테이블이라 칭한다.

- 참조되는 테이블, 즉 PK가 존재하는 테이블을 부모 테이블이라 한다.

- 부모테이블의 PK컬럼에 존재하는 데이터만 자식테이블에 입력할 수 있다.

- 부모테이블은 자식의 데이터나 테이블이 삭제된다고 영향을 받지 않는다.

- 참조하는 데이터 컬럼과 데이터 타입이 반드시 일치해야 한다.

- 참조할 수 있는 컬럼은 기본키(PK)이거나, UNIQUE만 가능하다. (보통 PK랑 엮는다)

2-1. FK 선언

-- 테이블 생성 시 설정
CREATE TABLE pTable(
   pPK	number(10)	primary key
);

CREATE TABLE cTable(
    pPK	number(10),
    Col1	varchar2(10),
    CONSTRAINTS fk_code foreign key( pPK )
        references pTable( pPK ) on delete cascade
);

CONSTRAINTS [제약조건명] foreign key( [컬럼명] )
        references [참조할 테이블 이름]( [참조할 컬럼] ) 
        [ on delete cascade || on delete set null ]

-- 테이블 생성 후 설정
ALTER TABLE [테이블명]
ADD CONSTRAINTS [외래키 이름] FOREIGN KEY([참조컬럼])
REFERENCES [참조 테이블명]( [참조컬럼] ) ;

2-2. 외래키 삭제

- on delete cascade

	-> 참조되는 부모 테이블의 행에 대한 delete를 허용한다., 참조되는 부모 테이블 값이 삭제되면 연쇄적으로 자식 테이블의 값 또한 삭제된다.

- on delete set null

	-> 참조되는 부모 테이블의 행에 대한 delete를 허용한다.
	    이건 cascade와 다르게 부모 값이 삭제되면 해당 삭제된 값들을 참조하는
	    자식 테이블의 값들이 NULL 값으로 설정된다.

2-3. FK SQL 예시

-- FK

-- 테이블 생성과 외래키 지정 동시
CREATE TABLE foreign_key(
	department_id number(4),
	CONSTRAINTS dept_fk FOREIGN KEY (department_id)
		REFERENCES DEPARTMENTS (department_id)	
);

-- 테이블 생성하고 난 후 외래키를 지정하는 방법
CREATE TABLE foreign_key2(
	department_id	number(4)
);

ALTER TABLE FOREIGN_KEY2 
ADD CONSTRAINTS dept_fk2 FOREIGN KEY (department_id)
REFERENCES departments (department_id)
;

3. PK와 FK의 예제

CREATE TABLE daddy(
	idx 	NUMBER(10),
	mID 	NUMBER(10) PRIMARY KEY 
);

-- daughter
CREATE TABLE daughter(
	idx 	number(10) PRIMARY KEY,
	mID 	number(10),
	CONSTRAINTS FK_DA FOREIGN KEY (mID)
	REFERENCES daddy (mID) ON DELETE CASCADE 
);

INSERT INTO daddy VALUES (1, 10);
INSERT INTO daddy VALUES (2, 20);
INSERT INTO daddy VALUES (3, 30);

SELECT * FROM DADDY d ;

INSERT INTO daughter VALUES (100, 10);
INSERT INTO daughter VALUES (101, 10);
INSERT INTO daughter VALUES (102, 20);

SELECT * FROM DAUGHTER d ;

INSERT INTO daughter VALUES (103, 30);

DELETE DADDY WHERE idx = 2; 

-- daughter2
CREATE TABLE daughter2(
	idx 	number(10) PRIMARY KEY,
	mID 	number(10),
	CONSTRAINTS FK_DA2 FOREIGN KEY (mID)
	REFERENCES daddy (mID) ON DELETE SET NULL  
) ;

INSERT INTO daughter2 VALUES (100, 10);
INSERT INTO daughter2 VALUES (101, 10);
INSERT INTO daughter2 VALUES (103, 30);

SELECT * FROM daughter2 ;

DELETE DADDY WHERE idx = 1 ;
profile
도비는 자유에요!😝

0개의 댓글