Backend/Oracle DB

05. Oracle DB, 제약조건 (Constraint)

개발개발빈이 2022. 5. 16. 19:48

○ 테이블 제약조건

    ① primary key

        - 기본키, 유일성
        - 중복 및 null값을 허용하지 않음 (빈값을 허용하지 않음)
        - where 조건절에 걸릴 수 있는 대표적인 칼럼을 강제할 수 있다
        - 예) 주민등록번호, 핸드폰번호, 이메일, 아이디, 계좌번호 등
    ② not null
        - 빈값을 허용하지 않음 (반드시 입력해야 함)

    ③ check

        - 입력할 값을 특정범위로 제한하는 조건

    ④ default
        - 사용자가 값을 입력하지 않으면 해당칼럼이 정의한 기본값을 자동으로 입력

    ⑤ unique
        - 중복 허용 안함
        - null값은 한번만 허용

    ⑥ foreign key
        - 외래키, 테이블 조인하는 경우 부모와 자식 관계를 설정

-- sungjuk테이블 생성
create table sungjuk(
    sno     int         primary key                     -- 기본키
    ,uname  varchar(50) not null                        -- 빈값을 허용하지 않음
    ,kor    int         check(kor between 0 and 100)    -- 국어 점수 0~100사이만 입력가능
    ,eng    int         check(eng between 0 and 100)    -- 영어 점수 0~100사이만 입력가능
    ,mat    int         check(mat between 0 and 100)    -- 수학 점수 0~100사이만 입력가능
    ,addr   varchar(20) check(addr in('Seoul', 'Jeju', 'Busan', 'Suwon'))
    ,aver   int         default 0			-- 값을 입력하지 않으면 기본값0
    ,wdate  date        default sysdate                 -- 값을 입력하지 않으면 기본값 현재 날짜
);

sungjuk테이블 및 입력 데이터

 

제약조건 위배시 에러 메세지

    ① primary key

        - ORA-00001: 무결성 제약 조건(SYSTEM.SYS_C007358)에 위배됩니다

-- sno칼럼은 기본키(PK)이므로 중복된 값을 허용하지 않음
insert into sungjuk(sno, uname, kor, eng, mat) values(2, '홍길동', 10, 20, 30); --ORA-00001

    ② not null
        - ORA-01400: NULL을 ("SYSTEM"."SUNGJUK"."UNAME") 안에 삽입할 수 없습니다

-- uname칼럼에 반드시 값을 입력해야 함
insert into sungjuk(sno, kor, eng, mat) values(1, 10, 20, 30); --ORA-01400

    ③ check

        - ORA-02290: 체크 제약조건(SYSTEM.SYS_C007354)이 위배되었습니다

-- 국영수 점수는 0~100 사이만 가능
insert into sungjuk(sno, uname, kor, eng, mat) values(1, '홍길동', -10, 20, 30); --ORA-02290

    ④ 칼럼의 개수와 값 개수가 일치하지 않는 경우
        - SQL 오류: ORA-00913: 값의 수가 너무 많습니다

insert into sungjuk(sno, uname, kor, eng, mat) values(10, '홍길동', 10, 20, 30, 'Seoul'); --ORA-00913