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

[7일차] DDL(CREATE)

by Dodledd 2024. 2. 25.

DDL(Data Definition Language)  : 데이터 정의 언어 란? 

다른말로 데이터 정의어,

오라클에서 제공하는 객체를 새로 만들고, 구조를 변경하고, 구조 자체를 삭제하는 즉

실제 데이터 값이 아닌 규칙 자체를 정의하는 언어이다.

 

그럼 오라클에선  무슨 객체(구조)가 있을까?

  1. 테이블
  2. 시퀀스
  3. 인덱스
  4. 패키지
  5. 트리거
  6. 프로시저
  7. 함수
  8. 동의어
  9. 사용자

이렇게 존재하며 차차 알아가게 될 것 같다.

오늘은 DDL에 대해 다뤄보겠다 !

 

먼저 DDL의 첫 번째

생성을 담당하는

 

CREATE

객체(테이블)을 생성하는 구문

 

테이블이란? 

  • 행과 열로 구성되는 가장 기본적인 데이터베이스 객체, 모든 데이터들은 테이블을 통해서 저장된다.
[사용법]
CREATE TABLE 테이블명(
컬럼명 자료형(크기),
컬럼명 자료형(크기),
컬럼명 자료형,
...

 

 

혹시나 자료형을 잊었을 수 있으니 자료형에 대해 잠깐 복습해보자 !

*자료형 -문자(CHAR(바이트크기) | VARCHAR2(바이트크기))

CHAR : 최대 2000바이트까지 지정가능 / 고정길이(고정된 글자수의 데이터가 담길 경우)
(지정한 크기보다 더 작은 값이 들어오면 공백으로라도 채워서 처음 지정한 크기를 만들어준다)

VARCHAR2 : 최대 4000바이트까지 지정가능 / 가변길이(몇 글자의 데이터가 담길지 모르는 경우)
(담긴 값에 따라서 공간 크기가 맞춰짐)

숫자(NUMBER)

날짜(DATE)

SQL언어에서 자료형엔 딱히 특이한게 없고 사용하기 편리한 구조로 되어있으니 기억을 잘 해놓자

  • 회원에 대한 데이터를 담기위한 테이블 MEMBER 생성
CREATE TABLE MEMBER(
    MEM_NO NUMBER,
    MEM_ID VARCHAR2(20),
    MEM_PWD VARCHAR2(20),
    MEM_NAME VARCHAR2(20),
    GENDER CHAR(3), //남, 여 로 받기때문에 3BYTE, 한글은? : 한 글자에 3바이트!
    PHONE VARCHAR2(13),
    EMAIL VARCHAR2(50),
    MEM_DATE DATE
);

CREATE 실행 결과

CREATE 쿼리를 실행했는데 컬럼만 잔뜩 나왔다.

당연하다 우리는 테이블의 컬럼만 생성한 것이고 값을 넣어주지 않았으니 빈 테이블이(컬럼만 있는) 나오게 된다.

 

컬럼에 주석달기

CCOMMENT ON COLUMN 테이블명.컬럼명 IS "주석내용";
TIP)잘못 작성시 새로 수정하면 된다.
COMMENT ON COLUMN MEMBER.MEM_NO IS '회원번호';
COMMENT ON COLUMN MEMBER.MEM_ID IS ' 회원아이디';
COMMENT ON COLUMN MEMBER.MEM_PWD IS '회원비밀번호';
COMMENT ON COLUMN MEMBER.MEM_NAME IS '회원명';
COMMENT ON COLUMN MEMBER.GENDER IS '성별';
COMMENT ON COLUMN MEMBER.PHONE IS '전화번호';
COMMENT ON COLUMN MEMBER.EMAIL IS '이메일';
COMMENT ON COLUMN MEMBER.MEM_DATE IS '회원가입일';

이런식으로 주석을 달아서 가독성을 높일 수 있다.

 

DROP

테이블 삭제하는 구문

[사용법]
DROP TABLE 테이블명;
DROP TABLE MEMBER;

이렇게 하면 되는데 솔직히 테이블을 만들어놓고 삭제할 일은 거의 없을 것 같다는 생각이 든다.

 

INSERT

테이블에 데이터를 추가시키는 구문

[사용법]
INSERT INTO 테이블명 VALUES(값1, 값2, 값3...멤버 테이블의 각 컬럼의 행 만큼 값을 넣어줘야함)

 

그럼 위에 만든 MEMBER 테이블에 값을 넣어보자.

INSERT INTO MEMBER
VALUES(1, 'USER1', 'PASS1', '홍길동', '남', '010-1111-2222', 'SDFSE@GAGF2341', '24/02/23');

 

 

*주의사항

INSERT INTO MEMBER
VALUES( NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL);

테이블에 널만 들어가 있다면 오류가 발생하게된다. (하지마라는 뜻)


 

제약조건

원하는 데이터값(유효한 형식의 값)만 유지하기 위해서 특정 컬럼에 설정하는 제약
테이터 무결성 보장을 목적으로 한다.

종류 : NOT NULL, UNIQUE, CHECK, PRIMARY KEY, FOREIGN KEY

 

NOT NULL

NOT NULL 제약조건 해당 컬럼에 반드시 값이 존재해야만 할 경우(즉, 절때 NULL이 들어오면 안되는 경우
삽입/수정시 NULL값을 허용하지 않도록 제한

제약조건을 부여하는 방식은 크게 2가지가 있다.
(컬럼레벨방식 / 테이블레벨 방식) NOT NULL제약 조건은 무조건 컬러레벨방식으로만 가능하다.

 

예를 들어보자, 회원 정보에 관한 테이블을 만들게 될 때 꼭 필요한 정보들이 있다.

이름, 나이, 성별, 아이디, 비밀번호 등등.. 이름이 없으면 사람을 특정할 수 없고 사람이라면 성별과 나이를 꼭 가지고 있다.

이런 필수정보에 NOT NULL을 써주면 된다!

 

CREATE TABLE MEM_NOTNULL(
    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),
    PHONE VARCHAR2(13),
    EMAIL VARCHAR2(50)
);

 

위 테이블에 값을 넣어보자

INSERT INTO MEM_NOTNULL
VALUES(2, 'USER2', NULL, '홍길서', NULL, NULL, NULL);

현재 PWD 즉 비밀번호에 NULL 값을 넣으려고 하면

이렇게 오류가 뜨게 된다.

 


UNIQUE

해당컬럼에 중복된 값이 들어가서는 안될 경우 사용한다.
컬럼값에 중복값을 제한하는 제약조건이다.
삽입/ 수정시 기존에 있는 데이터값 중 중복값이 있을 경우 오류를 발생시킨다.

 

사용법은 간단하다. 그냥 제약조건 뒤에 붙여주면 된다.

CREATE TABLE MEM_UNIQUE(
    MEM_NO NUMBER NOT NULL,
    MEM_ID VARCHAR2(20) NOT NULL UNIQUE, --컬럼레벨 방식
    MEM_PWD VARCHAR2(20) NOT NULL,
    MEM_NAME VARCHAR2(20) NOT NULL,
    GENDER CHAR(3),
    PHONE VARCHAR2(13),
    EMAIL VARCHAR2(50)
);

이렇게 컬럼명 줄에 달아주는 것을 컬럼레벨 방식이라 한다.

 

다른 방식 한 가지가 더 있다

CREATE TABLE MEM_UNIQUE(
    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),
    PHONE VARCHAR2(13),
    EMAIL VARCHAR2(50)
    UNIQUE(MEM_ID)  --테이블 레벨 방식
);

이렇게 테이블 제일 밑에 따로 UNIQUE(컬럼명) 으로 작성하는 것을

테이블 레벨 방식이라고 한다.

 

둘 다 장단점이 있다고 생각한다.

 

컬럼 레벨 방식은 우리가 코드를 읽을 때 한눈에 들어와 가독성이 뛰어나고

테이블 레벨 방식은 여러가지를 한번에 기술해야 할 때 편리할 것 같다.

하지만 그래도 컬럼 레벨 방식이 조금 더 많이 쓰인다고 한다.

 

위 만들어진 테이블에 값을 넣어 UNIQUE가 제대로 적용 되었는지 확인해보자!

INSERT INTO MEM_UNIQUE
VALUES(1, 'USER1', 'PASS1', '홍길동', '남', '010-1111-2222', 'AAAA@NAVER.COM');

 

INSERT INTO MEM_UNIQUE
VALUES(2, 'USER1', 'PASS1', '홍길동', '남', '010-1111-2222', 'AAAA@NAVER.COM');

이렇게 ID 가 같은 INSERT 쿼리를 실행하려 하니 오류가 발생한다.

UNIQUE가 제대로 적용됐다는 것이다.

 

제일 밑 줄 오류 구문을 보면

ORA-00001: unique constraint (KH.SYS_C007119) violated 이렇게 나와있는데

컴퓨터가 알아서 오류번호를 부여하는 것인데 우리가 확인하기도 어렵고 뭔 소리인가 싶다.

 

그래서 이 오류를 우리가 원하는 메세지로 발생할 수 있게 해주는 것이 있다.


제약조건명 설명 방법

이것도 두 가지 방법이 있다. 위에서 배웠듯 컬럼레벨 , 테이블 레벨이 있다.

 

1. 컬럼레벨방식

컬럼레벨방식 CREATE TABLE 테이블병(
컬럼명 자료형 (CONSTRAINT 제약조건명)제약조건 )

 

2. 테이블레벨 방식

CREATE TABLE 테이블명(
컬럼명 자료형,
컬럼명 자료형,
(CONSTRAINT 제약조건명) 제약조건(컬럼명) )

 

 

CREATE TABLE MEM_UNIQUE(
    MEM_NO NUMBER CONSTRAINT MEMNO_NT NOT NULL,
    MEM_ID VARCHAR2(20) CONSTRAINT MEMID_NT NOT NULL , --컬럼레벨 방식
    MEM_PWD VARCHAR2(20) CONSTRAINT MEMPWD_NT NOT NULL,
    MEM_NAME VARCHAR2(20) CONSTRAINT MEMNAME_NT NOT NULL,
    GENDER CHAR(3),
    PHONE VARCHAR2(13),
    EMAIL VARCHAR2(50),
    --테이블 레벨 방식
    --UNIQUE(MEM_ID)
    CONSTRAINT MEMID_UQ UNIQUE(MEM_ID)
);

NOT NULL은 컬럼레벨 방식으로하고

UNIQUE는 테이블 레벨 방식으로 선언하였다.

 

값을 넣어서 잘 적용됐는지 확인해보자

INSERT INTO MEM_UNIQUE
VALUES(1, 'USER1', 'PASS1', '홍길동', '남', '010-1111-2222', 'AAAA@NAVER.COM');

 

INSERT INTO MEM_UNIQUE
VALUES(2, 'USER1', 'PASS1', '홍길동', '남', '010-1111-2222', 'AAAA@NAVER.COM');

위 쿼리 실행결과

이렇게 두 번째 쿼리를 실행하면 오류가 나고 ORA-00001: unique constraint (KH.MEMID_UQ) violated 로 MEMID_UQ

로 우리가 설정한 제약조건메세지가 나오는 것을 볼 수 있다.

 

INSERT INTO MEM_UNIQUE
VALUES(3, 'USER2', 'PASS1', NULL, '남', '010-1111-2222', 'AAAA@NAVER.COM');

NOT NULL과 UNIQUE 두 가지에 대한 오류도 잘 나오는 것을 볼 수 있다.


 

CHECK

해당컬럼에 들어올 수 있는 값에 대한 조건을 제시해둘 수 있다
해당 조건에 만족하는 데이터 값만 담길 수 있다

[사용법]
CHECK (조건식)

 

CREATE TABLE MEM_CHECK(
    MEM_NO NUMBER CONSTRAINT MEMNO_NT NOT NULL,
    MEM_ID VARCHAR2(20) CONSTRAINT MEMID_NT NOT NULL , --컬럼레벨 방식
    MEM_PWD VARCHAR2(20) CONSTRAINT MEMPWD_NT NOT NULL,
    MEM_NAME VARCHAR2(20) CONSTRAINT MEMNAME_NT NOT NULL,
    GENDER CHAR(3) CONSTRAINT MEMNAME_CK CHECK(GENDER IN ('남', '여')), --남, 여
    PHONE VARCHAR2(13),
    EMAIL VARCHAR2(50),
    --테이블 레벨 방식
    --UNIQUE(MEM_ID)
    CONSTRAINT MEMID_UQ UNIQUE(MEM_ID)
);

이번에도 NOT NULL은 컬럼레벨방식, UNIQUE는 테이블 레벨 방식으로 선언하였다.

또 GENDER 에는 CHECK로 남, 여 만 입력할 수 있게 테이블을 생성했다.

 

INSERT INTO MEM_CHECK
VALUES(2, 'USER2', 'PASS2', '홍길', 'ㅇ', '010-1111-2223', 'EAAAA@NAVER.COM');

성별에 ㅇ을 넣었더니 오류가 나는 것을 볼 수 있다.

**하지만 NULL은 들어가게 된다. NULL은 값 자체가 없다는 뜻이기에 값으로써 NULL이 아닌 비어있다는 것을 알려주기 위해 NULL이 들어가진다

 


PRIMARY KEY

테이블에서 각 행(ROW)을 식별하기 위해 사용될 컬럼에 부여하는 제약조건(식별자 역할)

PRIMARY KEY(기본키) 제약조건
-유의사항 : 한 테이블당 오직 한개만 설정 가능-

 

예를들어 회원번호, 학번, 군번, 부서코드, 직급코드, 주문번호, 택배운송장번호, 예약번호 등등
PRIMARY KEY 제약조건을 부여 -> NOT NULL + UNIQUE 기능을 가지고 있다.

 

CREATE TABLE MEM_PRI(
    MEM_NO NUMBER CONSTRAINT MEMNO_PK PRIMARY KEY,
    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(13),
    EMAIL VARCHAR2(50),
     UNIQUE(MEM_ID)
);

제일 첫 번째 NUMBER에 PRIMARY KEY를 주고 제약조건위반 메세지 MEMNO_PK도 선언해주었다. (컬럼레벨방식)

테이블 레벨에는 UNIQUE가 선언되어 있다.

 

INSERT INTO MEM_PRI
VALUES(1, 'USER1', 'PASS1', '홍길동', '남', '010-5111-2444', 'AAAA@NAVER.COM');

위 코드를 실행해서 값을 넣어주고

 

INSERT INTO MEM_PRI
VALUES(1, 'USER2', 'PASS2', '홍길', '여', '010-5111-2424', 'AA3A@NAVER.COM');

위 코드를 실행하려하면 오류가 나온다.

이유가 무엇일까?

-> 기본키가 1로 같은데 기본키는 무조건 하나여야만 한다. (UNIQUE : 중복불가)

 

INSERT INTO MEM_PRI
VALUES(NULL, 'USER2', 'PASS2', '홍길', '여', '010-5111-2424', 'AA3A@NAVER.COM');

위 코드도 오류가 나게 되는데

기본키는 NULL값을 지정할 수 없다.(NOT NULL)


복합키

두 개의 컬럼을 동시에 하나의 PRIMARY KEY로 지정하는 것

*복합키는 테이블 레벨 방식으로 선언하는 것이 편하다.

CREATE TABLE MEM_PRI2(
    MEM_NO NUMBER,
    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(13),
    EMAIL VARCHAR2(50),
     UNIQUE(MEM_ID),
    PRIMARY KEY(MEM_NO, MEM_ID)
);

위는 그대로지만 제일 밑 테이블레벨 부분에 보면 PRIMARY KEY(MEM_NO, MEM_ID) 가 선언된 것을 볼 수 있다.

이런식으로 두 개의 컬럼 값을 합쳐 하나의 키로 만드는 것을 복합키라고 한다.

 

값을 하나 추가해주고

INSERT INTO MEM_PRI2
VALUES(1, 'USER1', 'PASS1', '홍길동', NULL, NULL, NULL);

 

 

값을 하나 더 추가하려하니

INSERT INTO MEM_PRI2
VALUES(1, 'USER2', 'PASS2', '홍길순', NULL, NULL, NULL);

잘 된다. 분명 기본키가 같은데 오류가 나지않고 삽입이 가능하다.

이유는 복합키로 설정해놓았기 때문에 MEM_NO, MEM_ID 가 둘 다 똑같지만 않으면 오류가 나지 않는다.

 

복합키는 헷갈릴 수 있으니 예시를 들어보자

--복합키 사용 예시(어떤 회원이 어떤 상품을 찜하는 지에 대한 데이터를 보관하는 테이블)
CREATE TABLE TB_LIKE(
    MEM_NO NUMBER,
    PRODUCT_NAME VARCHAR2(10),
    LIKE_DATE DATE,
    PRIMARY KEY(MEM_NO, PRODUCT_NAME)
);

위 테이블을 만들고 예를 들어 상상해보자.

네이버에서 쇼핑을 할 때 우리는 여러가지의 제품을 장바구니에 담을 수 있다.

INSERT INTO TB_LIKE VALUES(1,'자전거A', SYSDATE);

이렇게 자전거A를 담았고

 

INSERT INTO TB_LIKE VALUES(1,'자전거B', SYSDATE);

이렇게 자전거 B도 담았다.

 

만약 복합키가 아닌 MEM_ID로 기본키가 있다면, 우리는 같은 1 으로 오류가 날 것이고 장바구니에는 하나의 상품만 담을 수 있는 단일장바구니가 되는 것이다.

이럴 때 사용한다.


FOREIGN KEY(외래키)

다른 테이블에 존재하는 값만 들어와야되는 특정 컬럼에 부여하는 제약조건

  1. 다른 테이블을 참조한다고 표현
  2. 주로 FOREIGN KEY 제약조건으로 인해 테이블간 관계가 형성된다.  

 

[사용법]
FOREIGN KEY(외래키) 제약조건

* 컬럼레벨방식 컬럼명 자료형 REFERENCES 참조할 테이블
* 테이블레벨방식 FOREIGN KEY(컬럼명) REFERENCES 참조할 테이블명[(참조할 컬럼명)]
* 참조할 컬럼명 생략이 참조할 테이블에 PRIMARY KEY로 지정된 컬럼이 매칭된다.

 

 

예를 들어보자!

--회원등급에 대한 데이터를 따로 보관하는 테이블
CREATE TABLE MEM_GRADE(
    GRADE_CODE NUMBER PRIMARY KEY,
    GRADE_NAME VARCHAR2(30) NOT NULL
);
INSERT INTO MEM_GRADE VALUES(10, '일반회원');
INSERT INTO MEM_GRADE VALUES(20, '우수회원');
INSERT INTO MEM_GRADE VALUES(30, '특별회원');

이렇게 회원등급에 따른 값을 넣어주고 테이블을 완성해놓는다.

 

CREATE TABLE MEM(
    MEM_NO NUMBER 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(13),
    EMAIL VARCHAR2(50),
    GRADE_ID NUMBER REFERENCES MEM_GRADE(GRADE_CODE)
    --FOREIGN KEY(GRADE_ID) REFERENCES MEM_GRADE(GRADE_CODE)
);

마지막 줄을 보면 GRADE_ID 가 있는데 이것은 MEM_GRADE(GRADE_CODE)를 REFERENCES(참조) 한다고 선언되어 있다.

*외래키는 다른 테이블의 기본키를 가져오는 것이다.

INSERT INTO MEM VALUES(1, 'USER1', 'PASS1', '홍길순', '여', NULL, NULL, NULL);

마지막 NULL이 외래키 부분인데 외래키는 기본적으로 NULL값을 허용한다.

(회원등급이 없을 수도 있으니)

 

INSERT INTO MEM VALUES(2, 'USER2', 'PASS2', '홍길동', '남', NULL, NULL, 10);
INSERT INTO MEM VALUES(3, 'USER3', 'PASS3', '최재똥',NULL, NULL, NULL, 40); --오류

마지막 줄에서는 왜 오류가 날까?

외래키 부분이 40인데 우리가 만든 MEM_GRADE 테이블에는 10, 20, 30 까지만 등록이 되어 있기 때문에 

parent key not found라는 오류가 나게된다.

 

--MEM_GRADE(부모테이블) 1         :         N MEM(자식테이블)
-- 1:N 관계 1쪽이 부모테이블 N이 자식테이블

여기서 참조의 관계를 한 번 살펴보자.

자바에서 extends 로 상속을 받았듯, 부모클래스로부터 자식클래스가 여러개 탄생하듯

같은 개념으로 생각하면 될 것 같다.

MEM_GRADE는 그냥 회원등급를 저장하고 있는 테이블(부모테이블)이고 이것을 이용하는 헬스장 회원프로그램, 쇼핑몰 회원프로그램 등 여러가지의 자식테이블이 탄생할 수 있다.

그러므로 1개의 부모테이블에서는 N개의 자식테이블이 나올 수 있다.

 

우리는 위에서 부모테이블인 회원등급 테이블과

자식테이블인 MEM을 생성해서 외래키로 관계를 형성해줬다.

그럼 자식테이블 GRADE_ID 는 MEM_GRADE를 참조하고 있는데 이 때 부모테이블에서 데이턱 값을 삭제하게 된다면 어떻게 될까?

--데이터 삭제 : DELETE FROM 테이블명 WHERE 조건 :
DELETE FROM MEM_GRADE
WHERE GRADE_CODE = 10;

위 쿼리를 실행하면 오류가 나게되는데 이 오류는 이미 자식테이블에서 10이라는 값을 사용하고 있기 때문에 삭제가 불가능하다는 오류이다.

 

하지만 GRADE_CODE = 30 는 사용하고 있지 않기 때문에 삭제가 가능하다.

DELETE FROM MEM_GRADE
WHERE GRADE_CODE = 30;

여기서 우리는 자섹테이블이 이미 사용하고 있는 값이 있는 경우에 부모테이블에서는 삭제가 무조껀 안되는

"삭제제한" 옵션이 있다는 것을 알 수 있다.

 

자식테이블 생성시 외래키 제약조건 부여할 때 삭제옵션 지정
*삭제옵션 : 부모테이블의 데이터 삭제시 그 데이터를 사용하고 있는 자식테이블의 값을 어떻게 할 것인가?

-ON DELETE RESTRICTED(기본값) : 삭제제한옵션, 자식데이터로부터 쓰이는 부모데이터는 삭제가 아예 안됨
-ON DELETE SET NULL : 부모데이터 삭제시 해당 데이터를 사용하고 있는 자식 데이터의 값을 NULL로 변경
-ON DELETE CASCADE : 부모데이터 삭제시 해당 데이터를 사용하고 있는 자식데이터도 같이 삭제시키는 옵션

 

CREATE TABLE MEM(
    MEM_NO NUMBER 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(13),
    EMAIL VARCHAR2(50),
    GRADE_ID NUMBER REFERENCES MEM_GRADE(GRADE_CODE) ON DELETE CASCADE
    --FOREIGN KEY(GRADE_ID) REFERENCES MEM_GRADE(GRADE_CODE)
);

위 MEM 테이블을 생성할 때 ON DELETE CASCADE 도 같이 기술하여 부모데이터를 삭제시킬 때 데이터를 사용하고 있는 자식 데이터도 같이 삭제시키게 했다.

 

확인해보자 !

INSERT INTO MEM VALUES(1, 'USER1', 'PASS1', '홍길순', '여', NULL, NULL, NULL);
INSERT INTO MEM VALUES(2, 'USER2', 'PASS2', '홍길동', '남', NULL, NULL, 10);
INSERT INTO MEM VALUES(3, 'USER3', 'PASS3', '김개똥','여', NULL, NULL, 20);
INSERT INTO MEM VALUES(4, 'USER4', 'PASS4', '최배달','남', NULL, NULL, 10);

먼저 이렇게 4개의 데이터를 넣어주었다.

 

--10번 등급 삭제
DELETE FROM MEM_GRADE
WHERE GRADE_CODE = 10;

그리고 삭제 시 GRADE_ID가 10 이였던 친구들도 모두 삭제되었다.

 


DEFAULT

컬럼을 선정하지않고 INSERT시 NULL이 아닌 기본값을 INSERT하고자 한다.
이때 세팅해 둘 수 있는 값.

[사용법]
컬럼명 자료형 DEFAULT 기본값

 

CREATE TABLE  MEMBER(
    MEM_NO NUMBER PRIMARY KEY,
    MEM_NAME VARCHAR2(20) NOT NULL,
    MEM_AGE  NUMBER,
    HOBBY VARCHAR2(20) DEFAULT '없음',
    ENROLL_DATE DATE DEFAULT SYSDATE
);

위 처럼 DEFAULT 뒤에 '없음' 이나 원하는 말을 적어주고 테이블을 생성해준다.

그리고 테이블에 값을 넣을 때 DEFAULT를 적어주면 된다.

 

INSERT INTO MEMBER VALUES(1, '빵빵이', 20,'운동','20/01/01');
INSERT INTO MEMBER VALUES(2, '옥지', 22, DEFAULT ,DEFAULT);
INSERT INTO MEMBER VALUES(3, '최최최', 26, NULL ,NULL);

SELECT * FROM MEMBER;

이렇게 옥지에는 DEFAULT를 넣어놓은 후 모든 MEMBER의 값을 가져오면

옥지 행에는 취미가 DEFAULT인 '없음' 과 ENROLL_DATE에 DEFAULT인 오늘 날짜가 나온다.

 

 

--주의사항--

INSERT INTO MEMBER(MEM_NO, MEM_NAME) VALUES (4, '이광인');

이렇게 컬럼을 안주고 넣었을 시

테이블 생성 때 DEFAULT를 사용한 것은 DEFAULT의 값이 들어가고 사용하지 않은 것에는

NULL이 들어가는걸 알 수 있다.

 


테이블 복제

CREATE TABLE EMPLOYE_COPY
AS (SELECT * FROM EMPLOYEE);

이렇게 원래 있던 테이블의 COPY를 만들 수 있다.

 


데이터테이블은 한 번 만들면 변경이 힘들다.

만약 나중에 우리가 만든 데이터베이스로 서비스를 할 때 테이블의 제약조건에 문제가 있다면 어떻게 해결해야할까?

1. 테이블을 삭제하고 다시만든다 --> 서비스도중에 말도 안되는 소리다.

 

2. ALTER TABLE 사용 !

 

ALTER TABLE

테이블이 다 생성된 후에 뒤늦게 제약조건을 추가하는 방법

[사용법]
ALTER TABLE 테이블명 변경할 내용

-PRIMARY KEY : ALTER TABLE 테이블명 ADD PRIMARY KEY(컬럼명);
-FOREIGN KEY : ALTER TABLE 테이블명 ADD FOREIGN KEY(컬럼명) REFERENCES 참조할 테이블명[(참조할 컬럼)];
-UNIQUE : ALTER TABLE 테이블명 ADD UNIQUE(컬럼명);
-CHECK : ALTER TABLE 테이블명 ADD CHECK(컬럼에 대한 조건식);
-NOT NULL : ALTER TABLE 테이블명 MODIFY 컬럼명 NOT NULL;

 

[] 안에 있는 것들은 생략이 가능하다. 대신 시스템상 기본 값이 자동으로 들어가게 된다.

 

 

PRIMARY KEY (기본 키) 제약조건 추가

ALTER TABLE EMPLOYE_COPY ADD PRIMARY KEY(EMP_ID);
ALTER TABLE EMPLOYE_COPY DROP PRIMARY KEY; --삭제도 가능하지만 삭제시킬일이 거의 없다.

 

 

FOREIGN KEY (외래키) 제약조건 추가, 참조할 대상 잊지말기

--EMPLOYEE 테이블에 DEPT_CODE에 외래키 제약조건 추가
ALTER TABLE EMPLOYEE ADD FOREIGN KEY(DEPT_CODE) REFERENCES DEPARTMENT(DEPT_ID);
--EMPLOYEE 테이블에 JOB_CODE에 외래키 제약조건 추가
ALTER TABLE EMPLOYEE ADD FOREIGN KEY(JOB_CODE) REFERENCES JOB(JOB_CODE);
--DEPARTMENT 테이블에 LOCATION_ID에 외래키 제약조건 추가
ALTER TABLE DEPARTMENT ADD FOREIGN KEY(LOCATION_ID) REFERENCES LOCATION(LOCAL_CODE);

 

 

 

 

 

 

 

이렇게 데이터베이스 DDL이 마무리 되었다.

원래 생성-> SELECT(제어) 순 일텐데 나는 거꾸로 배웠다.

왜 거꾸로 배울까? 했는데 막상 배우고 나니까 이미 만들어져있는 테이블로 제어해보고 그 다음 CREATE순으로 배우니

이 방법이 훨씬 편하구나 라고 느꼈다!

복습잊지말자

'데이터베이스' 카테고리의 다른 글

[9일차] ETC(DCL, TCL) , VIEW(뷰)  (2) 2024.02.27
[8일차] DML(Data Manipulation Language), DDL(Data Definition Language)  (0) 2024.02.26
[6일차] SUBQUERY  (0) 2024.02.24
[5일차] JOIN  (0) 2024.02.23
[4일차] GROUP함수  (0) 2024.02.22