Programming/SQL

[Oracle] 제약조건(CONSTRAINTS) - CHECK/PRIMARY KEY(기본키)

Jayna. 2024. 2. 23. 16:54
728x90

 

 

[Oracle] USER_TABLES / USER_TAB_COLUMNS / INSERT문 / 제약조건(CONSTRAINTS) - NOT NULL, UNIQUE

데이터 딕셔너리 다양한 객체들의정보를 저장하고 있는 시스템 테이블 USER_TABLES 현재 이 계정이 가지고 있는 테이블들의 전반적인 구조를 확인할 수 있는 데이터 SELECT * FROM USER_TABLES; USER_TAB_COLUM

jaynarecord.tistory.com

CHECK

컬럼에 기록될 수 있는 값에 대한 조건을 설정해둘 수 있다.

CHECK (조건식)

 

CREATE TABLE MEM_CHECK(
     MEM_NO NUMBER NOT NULL,
     MEM_ID VARCHAR2(20) NOT NULL,
     MEM_PWD VARCHAR2(20) NOT NULL,
     MEM_NAME VARCHAR2(20) NOT NULL,
     GENDER CHAR(3) CHECK(GENDER IN ('남', '여')),
     PHONE VARCHAR2(15),
     EMAIL VARCHAR2(30),
     MEM_DATE DATE NOT NULL
);

INSERT INTO MEM_CHECK
VALUES (1, 'user01', 'pass01', '홍길동', '남', NULL, NULL, SYSDATE);

-- >> 회원가입일을 항상 SYSDATE 값으로 받으려면, 테이블 생성시 지정 가능
-- 특정 컬럼에 들어올 값에 대한 기본값 설정 => 제약 조건은 아님
CREATE TABLE MEM_CHECK(
     MEM_NO NUMBER NOT NULL,
     MEM_ID VARCHAR2(20) NOT NULL,
     MEM_PWD VARCHAR2(20) NOT NULL,
     MEM_NAME VARCHAR2(20) NOT NULL,
     GENDER CHAR(3) CHECK(GENDER IN ('남', '여')),
     PHONE VARCHAR2(15),
     EMAIL VARCHAR2(30),
     MEM_DATE DATE DEFAULT SYSDATE NOT NULL
);
728x90

 

PRIMARY KEY(기본키)

 => UNIQUE + NOT NULL

테이블에서 각 행들의 정보를 유일하게 식별할 수 있는 컬럼에 부여하는 제약조건으로,

각 행들을 구분할 수 있는 식별자의 역할

ex) 회원번호, 주문번호, 사번, 학번, 예약번호 , ...

 => 중복되지 않고(UNIQUE), 값이 존재(NOT NULL)해야만 하는 컬럼에 부여

CREATE TABLE MEM_PRIMARYKEY1(
    MEM_NO NUMBER CONSTRAINT MEM_PK PRIMARY KEY, -- 컬럼레벨 방식
    MEM_ID VARCHAR2(20) NOT NULL UNIQUE,
    MEM_PWD VARCHAR2(20) NOT NULL,
    MEM_NAME VARCHAR2(20) NOT NULL,
    GENDER CHAR(3) CHECK(GENDER IN ('남', '여')),
    PHONE VARCHAR2(15),
    EMAIL VARCHAR2(30)
    -- CONSTRAINT MEM_PK PRIMARY KEY(MEM_NO)      -- 테이블레벨 방식
);

INSERT INTO MEM_PRIMAIRY1 VALUES (1, 'user01', 'pass01', '홍길동', '남', NULL, NULL);
INSERT INTO MEM_PRIMAIRY1 VALUES (1, 'user02', 'pass02', '김길동', NULL, NULL, NULL);
-- 기본키 컬럼에 중복으로 인한 오류 발생
-- ORA-00001: unique constraint (DDL.MEM_PK) violated
INSERT INTO MEM_PRIMAIRY1 VALUES (NULL, 'user02', 'user02', '김길동', NULL, NULL, NULL);
-- 기본키 컬럼에 NULL 값으로 인한 오류 발생
-- ORA-01400: cannot insert NULL into ("DDL", "MEM_PRIMARYKEY1"."MEM_NO")
INSERT INTO MEM_PRIMAIRY1 VALUES (2, 'user02', 'pass02', '김길동', NULL, NULL, NULL);

 

>> 두 개 이상의 컬럼을 PRIMARY KEY로 설정하기

CREATE TABLE MEM_PRIMARYKEY2(
    MEM_NO NUMBER PRIMARY KEY, 
    MEM_ID VARCHAR2(20) PRIMARY KEY,
    MEM_PWD VARCHAR2(20) NOT NULL,
    MEM_NAME VARCHAR2(20) NOT NULL,
    GENDER CHAR(3) CHECK(GENDER IN ('남', '여')),
    PHONE VARCHAR2(15),
    EMAIL VARCHAR2(30)
);
-- 오류 발생 ORA-02260: table can have only on primary key
-- 한 테이블당 한 개의 컬럼만 설정 가능
-- 두 컬럼을 하나로 묶어서 PRIMARY KEY 하나로 설정 가능

CREATE TABLE MEM_PRIMARYKEY2(
    MEM_NO NUMBER, 
    MEM_ID VARCHAR2(20),
    MEM_PWD VARCHAR2(20) NOT NULL,
    MEM_NAME VARCHAR2(20) NOT NULL,
    GENDER CHAR(3) CHECK(GENDER IN ('남', '여')),
    PHONE VARCHAR2(15),
    EMAIL VARCHAR2(30),
    PRAMARY KEY (MEM_NO, MEM_ID) -- 컬럼을 묶어서 PRIMARY KET 하나로 설정 => 복합키
);

 

 

[Oracle] 제약조건(CONSTRAINT) - FOREIGN KEY(외래키) / ON DELETE SET NULL / ON DELETE CASCADE /ON DELETE RESTRICTED

FOREIGN KEY(외래키) 다른 테이블에 존재하는 값이 들어와야 되는 컬럼에 부여하는 제약조건 => 다른 테이블(부모 테이블)을 참조한다고 표현 즉, 참조된 다른 테이블이 제공하고 잇는 값만 들어올

jaynarecord.tistory.com

 

728x90