Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

삼식이의 코딩스토리

[SQL] 테이블 생성(CREATE) 및 제약 조건(Constraint) 본문

Backend/sql

[SQL] 테이블 생성(CREATE) 및 제약 조건(Constraint)

코딩은아파 2024. 3. 16. 18:04
  • CREATE
  • COMMENT
  • 제약조건(NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK 

 

 

CREATE(테이블 생성)

 

표현식

CREATE TABLE 테이블명 (칼럼명 자료형(크기), 칼럼명 자료형(크기), ...)

 

-- 테이블 생성 예시
CREATE TABLE MEMBER(
    MEMBER_ID VARCHAR2(20),
    MEMBER_PWD VARCHAR2(20),
    MEMBER_NAME VARCHAR2(20)
);

 위 예시는 MEMBER_ID, MEMBER_PWD, MEMBER_NAME의 칼럼을 갖는 MEMBER 테이블 생성하였다.


 

칼럼에 주석 달기

 

COMMENT ON COLUMN 테이블명. 칼럼명 IS '주석내용';

  • 칼럼에 주석을 달아 칼럼의 대한 정보를 기재할 수 있다.

 

COMMENT ON COLUMN MEMBER.MEMBER_ID IS '회원아이디';
COMMENT ON COLUMN MEMBER.MEMBER_PWD IS '비밀번호';
COMMENT ON COLUMN MEMBER.MEMBER_NAME IS '회원이름';

 

 


 

제약조건(Constraint)

  • 테이블 작성 시 각 칼럼에 대해 값 기록에 대한 제약조건을 설정할 수 있다.
  • 데이터 무결성 보장을 목적으로 한다.
  • 입력/수정하는 데이터에 문제가 없는지 자동으로 검사하는 목적
  • PRIMARY KEY, NOT NULL, UNIQUE, CHECK, FOREIGN KEY

 

NOT NULL 제약 조건

 

  • 해당 칼럼에 반드시 값이 기록 되어야 하는 경우에 사용
  • 삽입/수정 시 NULL 값을 허용하지 않는다.
  • 컬럼 레벨에서 설정 가능

 

CREATE TABLE USER_NOTNULL(
    USER_NO NUMBER NOT NULL,
    USER_ID VARCHAR2(20) NOT NULL,
    EMAIL VARCHAR2(50)
);

 

 USER_NO, USER_ID, USER_PWD, USER_NAME은 NULL 값을 허용하지 않는 제약조건이 있다. 따라서 데이터 삽입 시 NOT NULL 제약조건이 걸린 칼럼들은 데이터 값을 넣어줘야 한다. 

 

-- USER_ID 칼럼의 값이 NULL이므로 오류가 발생
INSERT INTO USER_NOTNULL(
    USER_NO
   ,USER_ID
   ,EMAIL
)
VALUES(
    1
   ,NULL
   ,'hong123@greedy.com'
);

 


 

 

UNIQUE 제약 조건

 

  • 칼럼의 입력 값에 대해 중복을 제한하는 제약조건
  • 컬럼 레벨에서 설정 가능
  • 테이블 레벨에서 설정 가능
  • 제약조건 위배 - 무결성 제약 조건

 

-- UNIQUE 제약 조건 컬럼 레벨 설정
CREATE TABLE USER_UNIQUE(
    USER_NO NUMBER,
    USER_ID VARCHAR2(20) UNIQUE NOT NULL,
    USER_PWD VARCHAR2(30) NOT NULL,
    USER_NAME VARCHAR2(30)
);

-- UNIQUE 제약 조건 테이블 레벨 설정
CREATE TABLE USER_UNIQUE(
    USER_NO NUMBER,
    USER_ID VARCHAR2(20) NOT NULL,
    USER_PWD VARCHAR2(30) NOT NULL,
    USER_NAME VARCHAR2(30),
    
    UNIQUE(USER_ID)		-- 어떤 컬럼에 제약조건을 걸지 명시해줘야 한다.
                        	-- UNIQUE(USER_ID, USER_ID) 처럼 여러개 컬럼을 한번에 제약조건을 걸 수 있다.
);

 USER_ID는 중복된 데이터 값이 들어오는 것을 제한하는 제약조건이 있다. 따라서 데이터 삽입시 USER_ID가 중복이 안되도록 쿼리문을 작성하여야 한다. (위 코드는 NOT NULL, UNIQUE 총 2개의 제약조건이 걸려있다.)

-- 해당 쿼리를 2번 실행하면 무결성 제약 조건에 위배된다.
INSERT INTO USER_UNIQUE(
    USER_NO
  , USER_ID
  , USER_PWD
  , USER_NAME
)
VALUES(
    1
  , 'user01'
  , 'pass01'
  , '홍길동'
);

 여기서 주의할 점이 있다. 2개 이상의 칼럼을 묶어서 하나의 테이블 레벨로 제약조건을 걸 때 해당 칼럼들이 모두 같아야 제약조건이 실행된다. 

 

 UNIQUE(USER_ID, USER_NO) -> ('USER01', 'USER01') 삽입되었을 시 ('USER02', 'USER01') 삽입 가능


 

 

CHECK 제약조건 

 

  • 칼럼에 기록되는 값에 조건 설정을 할 수 있다
  • CHECK(칼럼명 비교연산자 비교값)
  • 비교 값은 리터럴만 사용할 수 있다. (변하는 값이나 함수 사용 X)
  • 칼럼 레벨, 테이블 레벨 모두 설정 가능
  • 제약조건 위배 - 체크 제약조건

 

CREATE TABLE USER_CHECK(
    USER_NO NUMBER,
    USER_ID VARCHAR2(20) UNIQUE,
    USER_PWD VARCHAR2(30) NOT NULL,
    GENDER VARCHAR2(10) CHECK(GENDER IN ('남', '여'))
);

 GENDER 칼럼은 CHECK 제약조건으로 인해 값이 '남', '여'만 삽입될 수 있다.

INSERT INTO USER_CHECK(
    USER_NO
  , USER_ID
  , USER_PWD
  , GENDER
)
VALUES(
    1
  , 'user01'
  , 'pass01'
  , '남'
);

 

 

PRIMARY KEY(기본키) 제약조건

 

  • 테이블에서 한 행의 정보를 찾기 위해 사용할 칼럼을 의미한다.
  • 테이블에 대한 식별자 역할을 한다.
  • NOT NULL + UNIQUE 제약조건과 같다.
  • 한 테이블당 한 개만 설정할 수 있다.
  • 칼럼 레벨, 테이블 레벨에서 설정 가능
  • 기본키는 컬럼 1개로 설정할 수도 있고, 여러 개의 칼럼을 묶어서 복합키로 설정할 수 있다.

 

-- 컬럼 레벨에서 PK 설정
CREATE TABLE USER_PRIMARYKEY(
    USER_NO NUMBER CONSTRAINT PK_USER_NO PRIMARY KEY,
    USER_ID VARCHAR2(20) UNIQUE,
    USER_PWD VARCHAR2(30) NOT NULL,
    USER_NAME VARCHAR2(30)
);

-- 테이블 레벨에서 PK 설정 (복합키로 설정)
CREATE TABLE USER_PRIMARYKEY2(
    USER_NO NUMBER,
    USER_ID VARCHAR2(20),
    USER_PWD VARCHAR2(30) NOT NULL,
    USER_NAME VARCHAR2(30)
    
    CONSTRAINT PK_USER_NO2 PRIMARY KEY(USER_NO, USER_ID)
);

 

 

FOREIGN KEY(외부 키/외래 키) 제약조건

 

칼럼 레벨

[CONSTRAINT 이름] REFERENCES 참조할테이블명 [(참조할컬럼)] ON [삭제룰]

테이블 레벨

[CONSTRAINT 이름] FOREIGN KEY (적용할컬럼명) REFERENCES 참조할테이블명 [(참조할컬럼)] ON [삭제룰]

 

  • 참조(REFERENCES) 된 다른 테이블에서 제공하는 값만 사용할 수 있다
  • 참조 무결성을 위배하지 않게 하기 위해 사용
  • FOREIGN KEY 제약조건에 의해 테이블 간의 관계가 형성됨
  • 제공되는 값 외에는 NULL을 사용할 수 있다.
  • 참조 테이블의 참조 칼럼명이 생략이 된 경우는 참조 테이블의 PK로 설정된 칼럼이
    자동으로 참조 칼럼이 된다.
  • 참조될 수 있는 칼럼은 PK 칼럼과, UNIQUE 칼럼만 외래키로 참조할 수 있다.

 

-- 참조될 예시 테이블 생성(부모 테이블)
CREATE TABLE USER_GRADE(
    GRADE_CODE NUMBER PRIMARY KEY,
    GRADE_NAME VARCHAR2(30) NOT NULL
);

-- 다른 테이블을 참조할 예시 테이블 생성(자식 테이블)
CREATE TABLE USER_FOREIGNKEY(
    USER_NO NUMBER PRIMARY KEY,
    USER_ID VARCHAR2(20) UNIQUE,
    USER_PWD VARCHAR2(30) NOT NULL,
    USER_NAME VARCHAR2(30),
    GENDER VARCHAR2(10),
    PHONE VARCHAR2(30),
    EMAIL VARCHAR2(50),
    GRADE_CODE NUMBER,
    CONSTRAINT FK_GRADE_CODE FOREIGN KEY(GRADE_CODE) REFERENCES USER_GRADE (GRADE_CODE)
);

 

 부모 테이블의 칼럼인 GRADE_CODE의 값이 다음과 같다고 하자

 

 

 자식 테이블의 컬럼인 GRADE_CODE는 10, 20, 30, NULL 이외에 값이 들어오면 무결성 제약조건을 위배하게 되어 다음과 같은 오류 메시지가 나타난다.

 

 

 자식 테이블의 GRADE_CODE 값을 50으로 INSERT했을 때 나타나는 오류 메시지다. 오류가 난 이유는 부모 테이블의 GRADE_CODE 칼럼 값은 { 10, 20, 30 } 밖에 없는데 그 이외의 값인 50을 삽일 하려고 하여 오류가 발생한 것이다.


 

 

외래키 삭제 옵션

 

  • 부모 테이블의 데이터 삭제 시 자식 테이블의 데이터를
    어떤 식으로 처리할 것인지에 대한 내용 설정
  • ON DELETE RESTRICT
    - 부모 테이블의 칼럼 삭제 시 자식 테이블에서 참조하는 값일 경우 해당 칼럼의 값을 삭제 못한다.
    - 기본 설정
  • ON DELETE SET NULL
    - 부모 키를 삭제 시 자식 키를 NULL로 변경한다.
  • ON DELETE CASCADE
    - 부모 키를 삭제 시 자식 키를 가진 행도 함께 삭제

 

CREATE TABLE USER_FOREIGNKEY(
    USER_NO NUMBER PRIMARY KEY,
    USER_ID VARCHAR2(20) UNIQUE,
    USER_PWD VARCHAR2(30) NOT NULL,
    USER_NAME VARCHAR2(30),
    GENDER VARCHAR2(10),
    PHONE VARCHAR2(30),
    EMAIL VARCHAR2(50),
    GRADE_CODE NUMBER,
    CONSTRAINT FK_GRADE_CODE FOREIGN KEY(GRADE_CODE) REFERENCES USER_GRADE (GRADE_CODE) ON DELETE SET NULL
);

 

 

제약 조건에 이름 설정

 

-- 제약 조건에 이름 설정
CREATE TABLE CONS_NAME(
    TEST_DATA1 VARCHAR2(20) CONSTRAINT NN_TEST_DATA1 NOT NULL,
    TEST_DATA2 VARCHAR2(20) CONSTRAINT UN_TEST_DATA2 UNIQUE,
    TEST_DATA3 VARCHAR2(30),
    CONSTRAINT UN_TEST_DATA3 UNIQUE(TEST_DATA3)
);

-- 해당 제약조건을 검색
SELECT
       UC.*
  FROM USER_CONSTRAINTS UC
 WHERE TABLE_NAME = 'CONS_NAME';

 

 

 


 

출처: https://jddng.tistory.com/200 [IT 개발자들의 울타리:티스토리]

'Backend > sql' 카테고리의 다른 글

[sql] 오라클 계정생성과 삭제  (0) 2024.03.17