TODAY I LEARNED 0810-2

doyeon kim·2023년 8월 10일

DB

목록 보기
5/8

DDL_CREATE(데이터 정의 언어)

SQL 언어 종류

-- DQL (DATA QUERY LANGUAGE) : 데이터 질의(조회) 언어(EX: SELECT)

-- DML (DATA MANIPULATION LANGUAGE)
-- : 데이터 조작언어(INSERT,DELETE,UPDATE)

-- TCL (TRANSACTON CONTROL LANGUAGE) : 트랜젝션 제어 언어
-- DML 내용을 COMMIT, ROLLBACK

-- DDL (DATA DEFINITION LANGUAGE) : 데이터 정의 언어
-- 객체를 만들고,수정,삭제 등 데이터의 전체 구조를 정의하는 언어
--> 주로 DB관리자,설계자가 사용함

대표적인 DDL 언어 예시 : CREATE (생성)

테이블이나 인덱스, 뷰 등 다양한 데이터베이스 객체를 생성하는 구문
테이블로 생성된 객체는 DROP 구문을 통해 제거

CREATE 자료형

  • NUMBER : 숫자(정수,실수)
  • CHAR(크기) : 고정길이 문자형(저장한 문자열의 크기와 상관없이
    선언한 크기만큼의 저장공간이 할당됨)
  • VARCHAR2(크기) : 가변길이 문자형(저장한 문자열의 크기만큼
    유동적으로 저장공간 사용) 테이블 생성 예시
    CREATE TABLE "MEMBER"(
    MEMBER_ID VARCHAR2(20),
    MEMBER_PWD VARCHAR2(20),
    MEMBER_NAME VARCHAR2(30),
    MEMBER_SSN CHAR(14),
    ENROLL_DATE DATE DEFAULT SYSDATE --DATE 타입의 등록일 객체를 현재 시간을 디폴트 값으로 지정
    );

제약조건

*사용자가 원하는 조건의 데이터만 유지하기 위해 특정 컬럼에 제약 설정

  • 데이터 무결성 보장을 목적으로 함-> 중복 데이터x +
    입력 데이터에 문제가 없는지 자동으로 검사 +
    데이터의 수정/삭제 가능 여부 검사

    -> 제약조건을 위배하는 DML 구문은 수행할 수 없다

    제약조건 종류
    PRIMARY KEY, NOT NULL, UNIQUE, CHECK, FOREIGN KEY

===========================================================

1. NOT NULL 제약조건

CREATE TABLE USER_USED_NN(
USER_NO NUMBER NOT NULL, --사용자 번호 제약조건( NULL이면 안됨)
USER_ID VARCHAR2(20),
USER_PWD VARCHAR2(20),
USER_NAME VARCHAR2(30),
GENDER VARCHAR2(10),
PHONE VARCHAR2(30),
EMAIL VARCHAR2(50)
);
테이블을 이렇게 선언하고 안의 값을
INSERT INTO USER_USED_NN
VALUES(NULL,NULL,'PASS01','홍길동','남','010-1234-5678','HONG@'); 이렇게 정할 경우

USER_NO가 NULL이면 안된다는 테이블의 조건에 맞지 않아 에러가 발생한다

==================================================================

2. UNIQUE 제약조건

-- 컬럼에 입력값에 대해 중복을 제한하는 제약조건
-- 컬럼레벨, 테이블 레벨에서 설정 가능
-- (테이블 레벨 : 컬럼 정의가 끝난 후 마지막에 작성)
-- 단 UNIQUE 제약조건이 설정된 컬럼에 NULL값은 중복 삽입 가능

-- 제약조건 지정방법
-- 컬럼 레벨에서 지정할 경우: [CONSTRAINT 제약조건명] 제약조건
-- 테이블 레벨에서 지정할 경우: [CONSTRAINT 제약조건명] 제약조건(컬럼명)

예시

CREATE TABLE USER_USED_UK(
USER_ID VARCHAR2(20) UNIQUE, --컬럼레벨(제약조건명 미지정)
-- USER_ID VARVHAR2(20) CONSTRAINT USER_U UNIQUE --컬럼레벨(제약조건명 지정)
USER_PWD VARCHAR2(20),
USER_NAME VARCHAR2(30),
GENDER VARCHAR2(10),
PHONE VARCHAR2(30),
EMAIL VARCHAR2(50)
--테이블 레벨에서 지정
-- UNIQUE (USER_ID) --테이블 레벨(제약조건명 미지정)
-- CONSTRAINT USER_U UNIQUE(USER_ID) -- 테이블 레벨(제약조건명 지정)
);

UNIQUE 복합키: 두 개 이상의 컬럼을 묶어서 하나의 UNIQUE 제약조건
-- 복합키 지정은 테이블 레벨만 가능!
-- 복합키는 지정되는 모든 컬럼의 값이 같을 때 위배(AND 조건)

EX) 테이블 레벨에서 제약조건을 CONSTRAINT USER_ID_NAME_U UNIQUE(USER_ID,USER_NAME)
이렇게 정할 경우 USER_ID,USER_NAME이 둘 다 중복일 경우에만 에러가 발생

==================================================================

3.PRIMARY KEY(기본키) 제약조건

-- 테이블에서 한 행의 정보를 찾기 위해 사용할 컬럼
-- 테이블에 대한 식별자(학번,사번,회원번호) 역할을 함

--NOT NULL + NUIQUE -> 중복되지 않는 값이 필수로 존재(NULL X)해야됨

-- 한 테이블당 한개만 설정
-- 컬럼레벨,테이블레벨 둘 다 설정 가능
-- 한개 컬럼에 설정할 수도 있고 여러 개 묶어서 설정도 가능(복합 키)

예시

CREATE TABLE USER_USED_PK(
USER_NO NUMBER CONSTRAINT USER_NO_PK PRIMARY KEY, --컬럼레벨
USER_ID VARCHAR2(20),
USER_PWD VARCHAR2(20),
USER_NAME VARCHAR2(30),
GENDER VARCHAR2(10),
PHONE VARCHAR2(30),
EMAIL VARCHAR2(50)
--CONSTRAINT USER_NO_PK PRIMARY KEY(USER ID) --테이블 레벨
);

INSERT INTO USER_USED_PK
VALUES(1,'USER01','PASS01','홍길동','남','010-1234-5678','HONG@');

INSERT INTO USER_USED_PK
VALUES(1,'USER02','PASS02','김철수','남','010-1111-9876','KIM@');

USER_NO 를 기본 키로 지정하였기 때문에 USER_NO 가 중복될 경우 오류 발생

==================================================================

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

-- 참조된 다른 테이블의 컬럼이 제공하는 값만 사용 가능
-- FOREIGN KEY 제약조건에 의해 테이블간 관계가 형성
-- 제공하는 값 외에는 NULL 을 사용할 수 있음

-- 컬럼레벨
-- 컬럼명 자료형(크기) [CONSTRAINT 이름] REFERENCES 참조할 테이블명
-- [참조할 컬럼][삭제 룰]

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

-- 참조될 수 있는 컬럼은 PRIMARY 컬럼과 UNIQUE 로 지정된 컬럼만 외래키로 사용할 수 있음

예시
CREATE TABLE USER_GRADE(
GRADE_CODE NUMBER PRIMARY KEY,
GRADE_NAME VARCHAR2(30) NOT NULL
);
INSERT INTO USER_GRADE VALUES(10,'일반회원');
INSERT INTO USER_GRADE VALUES(20,'우수회원');
INSERT INTO USER_GRADE VALUES(30,'특별회원');

-> USER_GRADE 라는 테이블을 만들고 GRADE_CODE 를 기본 키로 지정 후 위에 값들을 대입

CREATE TABLE USER_USED_FK(
USER_NO NUMBER PRIMARY KEY,
USER_ID VARCHAR2(20) UNIQUE,
USER_PWD VARCHAR2(30) NOT NULL,
USER_NAME VARCHAR2(30),
GENDER VARCHAR2(20),
PHONE VARCHAR2(30),
EMAIL VARCHAR2(50),
GRADE_ID NUMBER CONSTRAINT GRADE_CODE_FK REFERENCES
USER_GRADE /(GRADE_CODE)/
--테이블 레벨
-- CONSTRAINT GRADE_CODE_FK FOREIGN KEY(GRADE_ID) REFERENCES
-- USER_GRADE
);

-> USER_USED_FK 테이블을 만들고 GRADE_ID 컬럼값에 USER_GRADE 테이블에서 참조한 값을 사용, 이 때 USER_GRADE 의 기본 키였던 GRADE_CODE의 값이 사용됨

INSERT INTO USER_USED_FK
VALUES(1,'USER01','PASS01','홍길동','남','010-1234-5678','HONG@',10);
-> 마지막 열인 GRADE_ID 에 USER_GRADE에서 참조한 값 10을 저장함

INSERT INTO USER_USED_FK
VALUES(3,'USER03','PASS01','홍길동','남','010-1234-5678','HONG@',NULL);
-> NULL은 USER_GRADE 테이블에 없어도 사용 가능

INSERT INTO USER_USED_FK
VALUES(4,'USER04','PASS01','홍길동','남','010-1234-5678','HONG@',50);
--50은 USER_GRADE 테이블에 GRADE_CODE 컬럼에 없는 값이라 오류

===========================================================

FOREIGN KEY 삭제 옵션

--부모 테이블의 데이터 삭제 시 자식 테이블의 데이터를 어떻게 처리할지 내용 설정 가능
-> 어떠한 설정도 하지 않은 경우 외래키로 지정된 컬럼에서 사용되고 있는 값이면 삭제가 불가하다

EX) DELETE FROM USER_GRADE ug WHERE GRADE_CODE =30;
->30을 참조하는 자식 레코드 USER_USED_FK 가 발견되어 삭제 X

DELETE FROM USER_GRADE ug WHERE GRADE_CODE =20;
->20을 참조하는 자식 레코드 없어서 삭제 가능

삭제 옵션

GRADE_CODE NUMBER CONSTRAINT GRADE_CODE_FK2 REFERENCES
USER_GRADE2/(GRADE_CODE)/ ON DELETE SET NULL --삭제옵션
->부모 테이블에서 삭제할 경우 자식 테이블에서 NULL로 표기되게 설정

EX) DELETE FROM USER_GRADE3 WHERE GRADE_CODE = 10;
이러고 USER_USED_FK 를 조회하면 해당 값을 가지던 GRADE_ID 가 NULL로 표기

GRADE_CODE NUMBER CONSTRAINT GRADE_CODE_FK3 REFERENCES
USER_GRADE3/(GRADE_CODE)/ ON DELETE CASCADE
->부모 테이블에서 삭제 시 해당 컬럼 참조하던 자식 테이블의 행 삭제

EX) DELETE FROM USER_GRADE3 WHERE GRADE_CODE = 10;
이러고 USER_USED_FK 를 조회하면 해당 값을 가지던 행 자체가 없어짐

0개의 댓글