SQL

SQL6 DDL(Data Definition Language)

#풀닢 2023. 1. 17. 17:25
DDL이란 데이터 정의 언어이다. 객체(Object)를 만들고(CREATE),
수정하고(ALTER),삭제(DROP)하는 구문
오라클 객체의 종류 테이블(TABLE),뷰(VIEW),시퀀스(SEQUENCE),인덱스(INDEX),패키지(PACKAGE), 프로시져(PROCEDUAL),함수(FUNCTION),트리거(TRIGGER),동의어(SYNONYM), 사용자(USER)

CREATE – 테이블만들기 [ 표현식 ]
CREATE TABLE 테이블명 (
        컬럼명 자료형(크기)
        , 컬럼명 자료형(크기)..
);
CREATE TABLE MEMBER(
MEMBER_ID VARCHAR2(20),
MEMBER_PWD VARCHAR2(20),
MEMBER_NAME VARCHAR2(20)
);

컬럼 주석 [ 표현식 ] COMMENT ON CULUMN 테이블명.컬럼명 IS ‘주석내용’;
COMMENT ON COLUMN MEMBER.MEMBER_ID IS ‘회원아이디’;
COMMENT ON COLUMN MEMBER.MEMBER_PWD IS ‘비밀번호’;
COMMENT ON COLUMN MEMBER.MEMBER_NAME IS ‘회원이름’;
제약 조건(CONSTRAINTS) 테이블 작성 시 각 컬럼에 대한 기록에 대해 제약조건을 설정할 수 있다.
데이터 무결성 보장이 주 목적

입력 데이터에 문제가 없는지 검사와 데이터의 수정/삭제 가능 여부 검사 등에 사용
NOT NULL 데이터에 NULL을 허용하지 않는다.
UNIQUE 중복된 값을 허용하지 않는다.
PRIMARY KEY ULL을 허용하지 않고, 중복 값을 허용하지 않는다. 컬럼의 고유 식별자로 사용하기 위함
FOREIGN KEY 참조되는 테이블의 컬럼의 값이 존재하면 허용
CHECK 저장 가능한 데이터 값의 범위나 조건을 지정하여 설정한 값만 허용
NOT NULL 해당 컬럼에 반드시 값이 기록되어야 하는 경우, 특정 컬럼에 값을 저장하거나 수정할 때 NULL값을 허용하지 않도록 컬럼 레벨에서 제한

NOT NULL 제약조건이 설정된 컬럼에 NULL값이 입력되면, 행 자체를 삽입하지 않는다.

CREATE TABLE
USER_NOCONS(
USER_NO NUMBER,
USER_ID VARCHAR2(20),
USER_PWD VARCHAR2(30),
USER_NAME VARCHAR2(30),
GENDER VARCHAR2(10),
PHONE VARCHAR2(30),
EMAIL VARCHAR2(50)
);

UNIQUE 컬럼에 입력 값에 대해 중복을 제한하는 제약조건이다.
컬럼레벨과 테이블레벨에 설정 가능 함

USER_NOCONS 테이블 생성

CREATE TABLE USER_NOCONS(
USER_NO NUMBER,
USER_ID VARCHAR2(20),
USER_PWD VARCHAR2(30),
USER_NAME VARCHAR2(30),
GENDER VARCHAR2(10),
PHONE VARCHAR2(30),
EMAIL VARCHAR2(50)
);

1행 삽입

INSERT
INTO USER_NOCONS
VALUES
(
1
, ’user01’
, ‘pass01’
, ‘홍길동’
, ‘남’
, ‘010-1234-5678’
, ‘hong123@greedy.com’
);

 / UNIQUE 제약조건이 없는 컬럼은 중복된 값도 저장을 허용

CREATE TABLE USER_UNIQUE(
USER_NO NUMBER,
USER_ID VARCHAR2(20) UNIQUE, --컬럼레벨
USER_PWD VARCHAR2(30),
USER_NAME VARCHAR2(30),
GENDER VARCHAR2(10),
PHONE VARCHAR2(30),
EMAIL VARCHAR2(50)
);

INSERT
INTO USER_UNIQUE
VALUES
(
1
, ’user01’
, ‘pass01’
, ‘홍길동’
, ‘남’
, ‘010-1234-5678’
, ‘hong123@greedy.com’
);

오류


PRIMARY KEY 테이블에서 한 행의 정보를 구분하기 위한 고유 식별자(IDENTIFIER)역할을 한다.
NOT NULL의 의미와 UNIQUE의 의미를 둘 다 가지고 있으며,
한 테이블 당 한 개만 설정 할 수 있음.

컬럼 레벨과 테이블 레벨에서 둘 다 지정 가능
CREATE TABLE USER_PRIMARYKEY(
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)
);

CREATE TABLE USER_PRIMARYKEY(
USER_NO NUMBER,
USER_ID VARCHAR2(20) UNIQUE,
USER_PWD VARCHAR2(30) NOT NULL,
USER_NAME VARCHAR2(30),
GENDER VARCHAR2(10),
PHONE VARCHAR2(30),
EMAIL VARCHAR2(50),
PRIMARY KEY(USER_NO)
);
FOREIGN KEY 참조 무결성을 유지하기 위한 제약조건
즉 참조된 다른 테이블이 제공하는 값만 사용할 수 있도록 제한을 거는 것
참조되는 컬럼과 참조된 컬럼을 통해 테이블간의 관계가 형성된다. 또한, 참조되는 값은 제공되는 값 이외에 NULL을 사용 가능하며, 참조할 테이블의 참조할 컬럼명을 생략할 경우에는 PRIMARY KEY로 설정된 컬럼이 자동으로 참조할 컬럼이 된다.
FOREIGN KEY 제약조건 USER_GRADE TABLE의 GRADE_CODE 컬럼을 참조 함
USER_GRADE 테이블을 USER_FOREIGNKEY 테이블에서 참조하는 관계이기 때문에 USER_GRADE 테이블의 데이터 삭제 시 참조무결성에 위배되기 때문에 삭제가 불가능

1) 테이블레벨

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,
FOREIGN KEY(GRADE_CODE) REFERENCES USER_GRADE(GRADE_CODE)
);

2) 컬럼레벨

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_USER_NO REFERENCESUSER_GRADE(GRADE_CODE)
);

-결과

INSERT
INTO USER_FOREIGNKEY
VALUES
(
1
, ‘user01’
, ‘pass01’
, ‘홍길동’
, ‘남’
, ‘010-1234-5678’
, ‘hong123@greedy.com’
, 10
);
삭제 옵션 부모 테이블의 데이터 삭제 시 자식 테이블의 데이터를 어떠한 방식으로 처리할 지에 대한 내용을 제약조건 설정 시 옵션으로 지정할 수 있음
기본 삭제 옵션은 ON DELETE RESTRICTED로 지정되어 있음
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 REFERENCES USER_GRADE(GRADE_CODE) ON DELETE SET NULL
);
DELETE
FROM USER_GRADE
WHERE GRADE_CODE = 10;

부모 테이블의 데이터 삭제 시 참조하고 있는 테이블의 컬럼 값이 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 REFERENCES USER_GRADE(GRADE_CODE) ON DELETE CASCADE
);

DELETE
FROM USER_GRADE
WHERE GRADE_CODE = 10;

부모 테이블의 데이터 삭제 시 참조하고 있는 테이블의 컬럼 값이 존재하던 행 전체를 삭제 함
CHECK 해당 컬럼에 입력되거나 수정되는 값을 체크하여, 설정된 값 이외의 값이면 에러를 발생시킨다. 비교연산자를 이용하여 조건을 설정하며, 비교값은 리터럴만 사용 가능하고 변하는 값이나 함수 사용이 불가능
CREATE TABLE USER_CHECK(
USER_NO NUMBER PRIMARY KEY,
USER_ID VARCHAR2(20) UNIQUE,
USER_PWD VARCHAR2(30) NOT NULL,
USER_NAME VARCHAR2(30),
GENDER VARCHAR2(10) CHECK(GENDER IN (‘남’,’여‘)),
PHONE VARCHAR2(30),
EMAIL VARCHAR2(50),
GRADE_CODE NUMBER
);

오류

INSERT
INTO USER_CHECK
VALUES
(
1
, 'user01'
, 'pass01'
, '홍길동'
, '남자'
, '010-1234-5678'
, 'hong123@greedy.com'
);

 

SMALL