DB/Oracle

CONSTRAINTS

hs_developer 2022. 6. 30. 00:17

제약 조건은 컬럼에 어떤 조건을 거는 것.

 

해당 컬럼에 조건을 걸면 해당 컬럼 또는 테이블 이용시 제약 조건을 지켜야 함.

 

 


 

PRIMARY KEY (기본키/PK)

테이블 당 하나만 가질 수 있는 키로서 해당 키를 가진 컬럼의 데이터를 중복이 불가하고 NULL이 데이터로 올 수 없다.

 

주민등록번호, ID 같이 다른 중복이 없어야 하는 데이터를 사용할 때 좋다.

 

 

#1

CREATE TABLE 테이블명(
	컬럼명 데이터형식 PRIMARY KEY
);
CREATE TABLE TEST_TABLE1(
    ID VARCHAR2(20) PRIMARY KEY,
    NAME VARCHAR2(20)
);

#2

CREATE TABLE 테이블명(
    컬럼명 데이터형식,
    CONSTRAINT 프라이머리키 이름 PRIMARY KEY(컬럼명)
);
CREATE TABLE TEST_TABLE2(
    ID VARCHAR2(20),
    NAME VARCHAR(20),
    CONSTRAINT PK PRIMARY KEY(ID)
);

 

 

 

FOREIGN KEY(외래키/FK)

외부의 테이블을 참조 시키고 싶을 때 해당 키를 컬럼에 지정해서 외부 테이블의 컬럼과 연동 가능하다.

 

ID 값을 공유해야 하는 A테이블(부모)와 B테이블(자식)이 있다고 했을 때

 

A테이블과 B테이블은 같은 ID 값을 공유해야 하는데 이 때 B테이블의 ID 컬럼에 외래 키를 지정하고

 

참조 테이블로 A테이블의 ID 컬럼을 참조하면 둘의 부모/자식 관계가 생긴다.

 

외래키 생성 시 주의 할 점
ㅇ부모 테이블(참조 테이블)의 컬럼은 PRIMARY KEY 또는 UNIQUE로 지정되어야 한다.
ㅇ부모 테이블에 없는 값은 자식 테이블에 추가할 수없다. 즉 부모 테이블에 있는 값만 자식 테이블이 가질 수 있다.

 

FOREIGN KEY로 묶인 부모 테이블의 컬럼 또는 값은 마음대로 삭제할 수 없다.

 

자식 테이블에서 컬럼과 값을 참조하고 있기 때문이다.

 

삭제하려면 자식의 컬럼, 값을 먼저 삭제하고 그 다음 부모 컬럼, 값을 삭제해야 한다.

 

또는 ON DELETE CASCASE, ON DELETE SET NULL이라는 조건을 추가한다.

 

ON DELETE CASCADE 부모 테이블의 값을 삭제하면 자식 테이블의 값도 연동하여 삭제한다.
ON DELETE SET NULL 부모 테이블의 값을 삭제하면 자식 테이블의 값이 NULL로 바뀐다.

 

CREATE TABLE 테이블명(
    컬럼명 데이터형식,
    CONSTRAINT 외래키명 FOREIGN KEY(적용 컬럼명)
    REFERENCE 참조테이블명(참조테이블 내 참조할 컬럼명)
    ON DELETE CASECADE(선택사항)
);
CREATE TABLE TEST_TABLE1(
    ID VARCHAR2(20),
    NAME VARCHAR2(20),
    CONSTRAINT PK PRIMARY KEY(ID)
);

CREATE TABLE TEST_TABLE2(
    ID VARCHAR2(20),
    NAME VARCHAR2(20),
    CONSTRAINT FK FOREIGN KEY(ID),
    REFERENCE TEST_TABLE1(ID),
    ON DELETE CASCADE
);

 

 

UNIQUE (고유키)

PRIMARY KEY와 비슷하다.

 

해당 키를 가진 컬럼은 중복된 데이터를 값으로 가질 수 없다.

 

다만 PRIMARY KEY와 차이점이라면 다음과 같다.

ㅇPRIMARY KEY와 달리 NULL 값도 허용한다.
ㅇ하나의 테이블에 다수의 UNIQUE KEY도 허용한다. (PRIMARY KEY는 하나만 허용)

 

 

위 이유로 PRIMARY KEY는 데이터 무결성을 위해 쓰인다.

 

#1

CREATE TABLE 테이블명(
	컬럼명 데이터형식 UNIQUE
);
CREATE TABLE TEST_TABLE1(
    ID VARCHAR2(20) UNIQUE,
    NAME VARCHAR2(20)
);

 

#2

CREATE TABLE 테이블명(
    컬럼명 데이터형식
    CONSTRAINT 유니크키명 UNIQUE(컬럼명)
);
CREATE TABLE TEST_TABLE2(
    ID VARCHAR2(20),
    NAME VARCHAR2(20),
    CONSTRAINT UK UNIQUE(ID)
);

 

 

 

CHECK

입력되는 값이 CHECK을 통해 미리 지정한 조건에 맞지 않으면 오류를 반환한다.

 

특정 값이나 범위를 지정해주면 해당 안에 입력 값이 맞는지 확인한다.

 

#1

CREATE TABLE 테이블명(
	컬럼명 데이터형식 CHECK(컬럼명>조건값)
);
CREATE TABLE TEST_TABLE1(
	NUM NUMBER CHECK(NUM > 10)
);

#2

CREATE TABLE 테이블명(
    컬럼명 데이터형식
    CONSTRAINT 체크키명 CHECK(컬럼명 > 조건값)
);
CREATE TABLE TEST_TABLE2(
    NUM NUMBER
    CONSTRAINT CK CHECK(NUM>10)
);

 

 

NOT NULL

NOT NULL은 해당 컬럼에 NULL 값과 공백 문자열을 허용하지 않는다.

 

CREATE TABLE 테이블명(
	컬럼명 데이터형식 NOT NULL
);
CREATE TABLE TEST_TABLE1(
	ID VARCHAR2(20) NOT NULL
);

 

 

DEFAULT (기본값)

Default가 설정되어 있는 컬럼에는 따로 데이터를 입력하지 않아도 Default 값으로 설정된 값이 저장된다.

 

 

테이블 생성할 때 Default (기본 값) 함께 생성

CREATE TABLE boardA(
    bidx number not null,
    title varchar2(10) not null,
    content varchar2(100) not null,
    delYN varchar2(1) default 'N' not null -- 기본 값을 N으로 설정
);

 

테이블 생성 후에 Default 값 추가하기

create table boardA(
    bidx number not null,
    title varchar2(10) not null,
    content varchar2(100) not null,
    delYN varchar2(1) not null
);

-- 기존의 컬럼에 Default 값 추가하기
alter table boardA modify (delYN default 'N');

 

적용한 Default 값 삭제하기

alter Table boardA modify (delyn default null);

 

create table boardA(
    bidx number not null primary key,
    title varchar2(10) not null,
    content varchar2(100) not null,
    delYN varchar2(1) default 'N' not null
);

insert into boardA(bidx, title, content)
values (1, '제목', '내용');

select * from boardA;

 

boardA에는 4개의 컬럼이 있지만 3개의 컬럼에만 데이터를 insert 했고,

테이블 출력 시, delYN에는 데이터를 삽입하지 않았지만 기본 값으로 들어있는 것을 확인할 수 있다.

 

참고

http://sgcomputer.tistory.com/250