본문 바로가기
데이터베이스

26일차// [Oracle] 제약조건 CONSTRAINT

by aesup 2021. 2. 17.
728x90

무결성: CONSTRAINT
COLUMN을 지정하는 성질

    primary key : 기본키  NULL을 허용하지 않는다. 빈칸은 안된다. 중복 불가 id, 주민번호
    unique key:   고유키. NULL은 허용한다. 중복 불가  E-mail
    foreign key:  외래키. 테이블과 테이블을 연결하는 목적의 성질이다.  Join
                  NULL  허용
                  외래키로 설정된 컬럼은 연결된 테이블에서PK나 UK로 설정되어있어야한다.
    CHECK       : 범위를 설정. 지정된 값외에는 사용할 수 없다. NULL허용
    NOT NULL    : NULL허용하지 않는다.

NOT NULL

        --NOT NULL
        CREATE TABLE TB_TEST01(
        COL1 VARCHAR2(10) NOT NULL,
        COL2  VARCHAR2(20) 
        );

        INSERT INTO tb_test01(COL1, COL2)
        VALUES('AAA','111');

        INSERT INTO tb_test01(COL1, COL2)
        VALUES('BBB','');     -- java "" != NULL

        SELECT
            *
        FROM tb_test01
        ;

        INSERT INTO tb_test01(COL1, COL2)
        VALUES('','222');


        INSERT INTO tb_test01(COL1)
        VALUES('CCC');

PRIMARY KEY

-- primary key = Unique + not null
DROP TABLE tb_test01
CASCADE CONSTRAINTS;   -- 지우기 무결성까지


CREATE TABLE TB_TEST01(

    PKCOL VARCHAR2(10) CONSTRAINT PK_TEST_01 PRIMARY KEY,
    COL1 VARCHAR2(20),
    COL2 VARCHAR2(20)
);


INSERT INTO tb_test01(PKCOL,COL1,COL2)
VALUES('AAA','aaa','111');


INSERT INTO tb_test01(PKCOL,COL1,COL2)
VALUES('BBB','','');

-- NULL넣으면 에러
INSERT INTO tb_test01(PKCOL,COL1,COL2)
VALUES('','','');

SELECT
    *
FROM tb_test01;

DROP TABLE tb_test01
CASCADE CONSTRAINTS;




CREATE TABLE TB_TEST01(

    PKCOL VARCHAR2(10) CONSTRAINT PK_TEST_01 PRIMARY KEY,
    COL1 VARCHAR2(20) CONSTRAINT PK_TEST_02 PRIMARY KEY,--table can have only one primary key
    COL2 VARCHAR2(20)
);
--primary key 는 한테이블안에서 여러개 생성 불가
-- 따로 테이블밖에서 alter를 통해 add해준다.

CREATE TABLE TB_TEST01(

    PKCOL VARCHAR2(10) ,
    COL1 VARCHAR2(20) ,
    COL2 VARCHAR2(20),
    CONSTRAINT PK_TEST_01 PRIMARY KEY(PKCOL,COL2)
);



CREATE TABLE TB_TEST01(

    PKCOL VARCHAR2(10) ,
    COL1 VARCHAR2(20) ,
    COL2 VARCHAR2(20)

);

UNIQUE KEY

--외부에서 ALTER  --> primary key 추가
--Unique: 고유키. 중복된 값은 입력불가 NULL 허용

CREATE TABLE TB_TEST01(
        UKCOL VARCHAR2(10) CONSTRAINT UK_TEST_01 UNIQUE,
        COL1 VARCHAR2(20),
        COL2 VARCHAR2(30)

);


INSERT INTO tb_test01(UKCOL,COL1,COL2)
VALUES('AAA','aaa','111');


INSERT INTO tb_test01(UKCOL,COL1,COL2)
VALUES('','aaa','111');

-- unique  키를 삭제해야할경우 
ALTER TABLE tb_test01
DROP CONSTRAINT UK_TEST_01

;

FOREIGN KEY

-- FOREIGN KEY : 외래키
--               기본테이블(departments)에서는 PK, UK 로 설정되어 있어야한다
--               NULL을 허용

--PARANT TABLE
CREATE TABLE TB_DEPT(
    DEPARTMENT_ID VARCHAR2(10),
    DEPARTMENT_NAME VARCHAR2(20),
    LOCATION_ID NUMBER,
    CONSTRAINT PK_DEPT_TEST PRIMARY KEY(DEPARTMENT_ID)
);

INSERT INTO TB_DEPT(DEPARTMENT_ID , DEPARTMENT_NAME, LOCATION_ID)
VALUES('10','기획부',120);--------------


INSERT INTO TB_DEPT(DEPARTMENT_ID , DEPARTMENT_NAME, LOCATION_ID)
VALUES('20','관리부',150);


INSERT INTO TB_DEPT(DEPARTMENT_ID , DEPARTMENT_NAME, LOCATION_ID)
VALUES('30','개발부',180);

--CHILD TABLE
CREATE TABLE TB_EMP(
        EMPNO VARCHAR2(10),
        ENAME VARCHAR2(20),
        DEPARTMENT_ID VARCHAR2(10),   ------>>>>외래키
        CONSTRAINT FK_EMP_TEST FOREIGN KEY(DEPARTMENT_ID)
        REFERENCES TB_DEPT(DEPARTMENT_ID)
        );


        INSERT INTO TB_EMP(EMPNO,ENAME,  DEPARTMENT_ID)
        VALUES(100,'이수빈', 10);

        INSERT INTO TB_EMP(EMPNO,ENAME,  DEPARTMENT_ID)
        VALUES(100,'성춘향', 20);

        INSERT INTO TB_EMP(EMPNO,ENAME,  DEPARTMENT_ID)
        VALUES(100,'외래', 30);


        INSERT INTO TB_EMP(EMPNO,ENAME,  DEPARTMENT_ID)
        VALUES(100,'성춘향', 40);  --->  외래키에 40이 없기때문에 오류

        SELECT
            *
        FROM tb_emp e, tb_dept d 
        WHERE e.department_id = d.department_id

        ;

CHECK

       --CHECK 지정된 값만 넣을 수 있다. NULL을 허용한다
        -- 중복 허용한다

        CREATE TABLE TB_CHECK(
        COL1 VARCHAR2(10),
        COL2 VARCHAR2(20),
        CONSTRAINT CHK_01 CHECK(COL1 IN('사과','배','바나나')),
        CONSTRAINT CHK_02 CHECK(COL2 > 0 and COL2 <=100)

        );

        INSERT INTO TB_CHECK(COL1, COL2)
        VALUES('사과',50);



        INSERT INTO TB_CHECK(COL1, COL2)
        VALUES('귤',50);


        INSERT INTO TB_CHECK(COL1, COL2)
        VALUES('바나나',0);
728x90