DATABASE/Oracle

[ORACLE] CONSTRAINT 제약조건 생성,삭제, PRIMARY KEY, UNIQUE, NOT NULL, FOREIGN KEY, CHECK, DEFAULT

잇나우 2020. 2. 5. 23:47
반응형

제약조건은 컬럼에 대한 속성을 정의하는것이고, 테이블의 부적절한 데이터가 입력되는 것을 방지하기 위해 정의한 규칙이다. 데이터의 무결성을 보호하기 위해 사용한다.

제약조건은 데이터베이스의 객체로 고유의 이름을 지정해주어야 한다. 따로 지정하지 않으면 시스템에서 자동으로 이름을 지정해준다. 제약조건에 대해 오류가 났을때 제약조건에 이름이 오류내용에 출력되는데 오라클에서 자동으로 지정해준 이름이기때문에 코드번호로 적혀있어 외우고 있지 않은 이상 알 수가 없다. 사용자가 특정한 이름을 지정해준다면 오류가 발생한 제약조건에 대해 더 빨리 찾을 수 있을 것이다.

제약조건 이름 지정하기

-- 예시 1)
CREATE TABLE TEST(
    id NUMBER(5) CONSTRAINT pk_id PRIMARY KEY,
    name VARCHAR(20),
    title VARCHAR(30)
);

-- 예시 2)
CREATE TABLE TEST(
    id NUMBER(5),
    name VARCHAR(20),
    title VARCHAR(30),
    CONSTRAINT pk_id PRIMARY KEY (id)
);

이미 만든 제약조건을 삭제할 수 있고 이미 만들어진 컬럼에 제약조건을 추가할 수도 있다. 하지만 CHECK와 같은 경우도 있으니 모두 되는것은 아니다.

제약조건 삭제

ALTER TABLE 테이블명 DROP CONSTRAINT 제약조건이름;

제약조건 추가

ALTER TABLE 테이블명 ADD CONSTRAINT 제약조건이름 제약조건 (컬럼명)

-- 예)
ALTER TABLE TEST ADD CONSTRAINT pk_id PRIMARY KEY (id)

PRIMARY KEY

기본키라고도 부른다. PRIMARY KEY를 제약조건으로 가진 컬럼은 같은 데이터 중복불가NULL값을 허용하지 않는다. 즉 UNIQUE + NOT NULL이 합쳐진 제약조건인 셈이다. 테이블 당 1개만 생성할 수 있고, 여러 컬럼을 묶어서 하나의 기본키로 만드는 것도 가능하다.

CREATE TABLE TEST(
    id NUMBER(5) CONSTRAINT pk_id PRIMARY KEY,
    name VARCHAR(20),
    title VARCHAR(30)
);

UNIQUE

중복값을 허용하지 않는 제약조건이다. NOT NULL과도 함께 쓸 수 있다.

CREATE TABLE TEST(
    id NUMBER(5),
    name VARCHAR(20) UNIQUE NOT NULL,
    title VARCHAR(30)

CREATE TABLE TEST(
    id NUMBER(5),
    name VARCHAR(20),
    title VARCHAR(30),
    CONSTRAINT name_unique UNIQUE (name)
);

NOT NULL

NOT NULL을 가진 컬럼은 반드시 데이터가 들어와야한다. 즉 NULL값을 허용하지 않는다.

CREATE TABLE TEST(
    id NUMBER(5),
    name VARCHAR(20),
    title VARCHAR(30) NOT NULL

FOREIGN KEY

외래키라고 부르는 제약조건이다. 참조키, 외부키, 외래키 여러가지 이름으로 부를 수 있는데 다른 테이블의 컬럼을 참조하는 기능을 하고 있다. 외래키가 정의된 테이블을 자식 테이블이라고 부른다. 참조하는 테이블의 컬럼과 외래키를 가지고 있는 컬럼의 데이터타입이 반드시 일치해야한다. 중복값을 허용하지 않는 유일한 데이터를 가진 컬럼 즉 PRIMARY KEY나 UNIQUE를 가진 컬럼에만 참조가 가능하다.

-- apple 테이블의 id 컬럼을 참조 방법 1
CREATE TABLE TEST(
    id NUMBER(5) CONSTRAINT fk_id REFERENCES apple (id), 
    name VARCHAR(20),
    title VARCHAR(30)
);    

-- apple 테이블의 id 컬럼을 참조 방법 2
CREATE TABLE TEST(
    id NUMBER(5),
    name VARCHAR(20),
    title VARCHAR(30),
    CONSTRAINT fk_id FOREIGN KEY (id) REFERENCES apple (id)
);

외래키로 참조하고 있을 경우 참조를 당하는 부모 테이블의 컬럼의 값은 삭제할 수가 없다. 삭제하고 싶다면 외래키를 전부 삭제를 한다음에는 삭제를 할 수가 있는데 굉장히 번거롭다. 외래키를 가진 테이블에 따로 속성을 주면 부모 테이블과 자식테이블의 값도 삭제할 수 있다.

 -- ON DELETE CASCADE
 CREATE TABLE TEST(
    id NUMBER(5),
    name VARCHAR(20),
    title VARCHAR(30),
    CONSTRAINT fk_id FOREIGN KEY (id) REFERENCES apple (id)
    ON DELETE CASCADE

-- ON DELETE SET NULL
 CREATE TABLE TEST(
    id NUMBER(5),
    name VARCHAR(20),
    title VARCHAR(30),
    CONSTRAINT fk_id FOREIGN KEY (id) REFERENCES apple (id)
    ON DELETE SET NULL

ON DELETE CASCADE
부모 테이블를 삭제할 수 있으며 자식 테이블의 데이터도 삭제된다.

ON DELETE SET NULL
부모 테이블을 삭제할 수 있으며 자식 테이블의 값이 NULL이 된다.

CHECK

조건에 맞는지 안맞는지 체크를 해주는 제약조건입니다. 조건과 맞지 않는다면 오류를 발생시킵니다. 즉 입력할수 있는 값의 범위를 제한할 수 있습니다. NOT NULL처럼 이미 조건에 맞지 않는 데이터가 있는 컬럼에 적용하려하면 오류가 발생합니다.

 CREATE TABLE TEST(
    id NUMBER(5),
    name VARCHAR(20) CHECK (name IN ('원숭이', '호랑이'))
    title VARCHAR(30)
);
-- 원숭이와 호랑이 두개의 값만 허용한다.

 CREATE TABLE TEST(
    id NUMBER(5),
    name VARCHAR(20),
    title VARCHAR(30),
    CONSTRAINT id_check CHECK (id >= 1 AND id <= 10)
);
-- 들어오는 데이터 값의 범위를 지정해줄 수 있다.

DEFUALT

테이블에 데이터를 추가할때 컬럼에 데이터를 넣지 않는다면 따로 무언가를 해주지 않았다면 NULL값이 들어간다. 그 이유는 DEFUALT의 값이 NULL로 설정되어 있기때문이다. 즉 기본값을 설정해줄 수 있는 제약 조건이다.

CREATE TABLE TEST(
    id NUMBER(5) PRIMARY KEY,
    name VARCHAR(20) DEFAULT '애벌레'
    title VARCHAR(30)
);
-- name의 값을 정해주지 않는다면 기본값으로 애벌레가 들어간다. 물론 숫자도 가능하다.
반응형