본문 바로가기
Study/SQL

10.DDL

by 로롤로롱 2023. 5. 2.

/*
<DDL(DATA DEFINITION LANGUAGE)>
    - 데이터 정의어
    - 오라클에서 제공하는 객체를 생성, 변경, 삭제하고 데이터의 구조 자체를 정의하는 언어
    - DB관리자, 설계자가 사용
        ->문서를 만들어주면 개발자가 쿼리를 작성하고 실행
    - DLL구문은 ROLLBACK 불가능
<ALTER>
    - 오라클에서 제공하는 객체를 수정하는 구문
    <테이블 수정>
        - ALTER TABLE 테이블이름 수정할내용;
        * 수정할 내용
            1) 컬럼추가/수정/삭제
            2) 제약조건 추가/삭제 <- 수정은 불가능(삭제 후 다시 추가)
            3) 테이블명/컬럼명/제약조건명 변경
*/

-- 테이블을 복사하여 실습용 테이블을 생성
-- 테이블을 복사하는데 조건문을 이요해서 원하는 데이터만 복사 할 수 있음
-- WHERE 조건을 주면 조건을 만족하는 데이터만 삽입
-- 원하는 컬럼만 선택하여 테이블 생성 가능
-- 컬럼에 별칭을 주게 되면 별칭으로 컬럼을 생성
DROP TABLE dept_copy;
CREATE TABLE DEPT_COPY
AS SELECT *
FROM DEPT;

-- 테이블 구조를 확인
DESC dept_copy;

/* 
    1)컬럼 추가/수정/삭제
        - ALTER TABLE 테이블명 ADD 컬럼명 데이터타입 [DEFAULT 기본값];
*/
-- CNAME컬럼을 추가 VARCHAR2(20) 
-- 기본값을 입력해주지 않으면 NULL값으로 채워진다.
ALTER TABLE dept_copy ADD cname VARCHAR2(20); 
-- DNAME컬럼을 추가 VARCHAR2(20) DEFALUT '대한민국', 모든 행의 새로 추가되는 컬럼을 기본값으로 초기화
ALTER TABLE dept_copy ADD dname VARCHAR2(20) DEFAULT '대한민국';

/*
    2)컬럼 수정(MODIFY)
        데이터 타입 변경
            ALTER TABLE 테이블명 MODIFY 컬럼명 변경할 데이터 타입
        기본값 변경
            ALTER TABLE 테이블명 MODIFY 컬럼명 DEFAULT 변경할값
*/
ALTER TABLE dept_copy MODIFY department_name VARCHAR2(30);
-- 변경하려는 자료형의 크기보다 큰 값이 존재할 경우 오류 발생
-- 일부 값이 너무 커서 열 길이를 줄일 수 없음
ALTER TABLE dept_copy MODIFY dname VARCHAR2(5); 
-- 열에 등록된 값이 있을경우 데이터 타입 변경 불가
ALTER TABLE dept_copy MODIFY dname NUMBER;
-- 다중 수정
ALTER TABLE dept_copy 
    MODIFY department_name VARCHAR2(40)
    MODIFY dname DEFAULT '미국';
/*
    3)컬럼 삭제(DROP COLUMN)
        ALTER TABLE 테이블명 DROP COLUMN 컬럼명;
            - 데이터 값이 들어있어도 삭제됨
            - 삭제된 칼럼은 복구 불가능(DLL구문은 ROLLBACK 불가능)
            - 테이블에 최소한 한개의 컬럼은 존재해야함
            - 참조되고 있는 컬럼이 있다면 삭제가 불가능
*/
ALTER TABLE dept_copy DROP COLUMN department_id;
ALTER TABLE dept_copy DROP COLUMN department_name;
ALTER TABLE dept_copy DROP COLUMN parent_id;
ALTER TABLE dept_copy DROP COLUMN manager_id;
ALTER TABLE dept_copy DROP COLUMN create_date;
ALTER TABLE dept_copy DROP COLUMN update_date;
ALTER TABLE dept_copy DROP COLUMN cname;
-- 마지막  하나는 삭제 불가, 테이블에 최소한 하나의 컬럼은 존재해야함 
ALTER TABLE dept_copy DROP COLUMN dname;

ALTER TABLE dept RENAME COLUMN department_id TO dept_id;
ALTER TABLE dept RENAME COLUMN department_name TO dept_name;
ALTER TABLE emp RENAME COLUMN department_id TO dept_id;
ALTER TABLE emp RENAME COLUMN employee_id TO emp_id;
ALTER TABLE job_history RENAME COLUMN employee_id TO emp_id;
ALTER TABLE job_history RENAME COLUMN department_id TO dept_id;
ALTER TABLE sales RENAME COLUMN employee_id TO emp_id;

/*
    2)제약조건 추가/삭제
        2-1)제약조건 추가
            PRIMARY KEY(UNIQUE + NOT NULL) :  ALTER TABLE 테이블명 ADD [CONSTRAINT 제약조건명] PRIMARY KEY(컬럼명);
            UNIGUE   : ALTER TABLE 테이블명 ADD [CONSTRAINT 제약조건명] UNIQUE(컬럼명);
            CHECK    : ALTER TABLE 테이블명 ADD [CONSTRAINT 제약조건명] CHECK(컬럼명);
            NOT NULL : ALTER TABLE 테이블명 MODIFY 컬럼명 [CONSTRAINT 제약조건명] NOT NULL;
*/
-- dept_copy
-- dept_id pk
-- dept_name unique
-- update_date not null
ALTER TABLE dept_copy ADD CONSTRAINT dept_copy_dept_id_pk PRIMARY KEY(dept_id)
ADD CONSTRAINT dept_copy_dept_name_uq UNIQUE(dept_name)
MODIFY create_date CONSTRAINT dept_copy_update_date_nn  NOT NULL;

SELECT uc.constraint_name, uc.constraint_type, uc.table_name, ucc.column_name
FROM user_constraints UC
JOIN user_cons_columns UCC
ON uc.constraint_name = ucc.constraint_name
WHERE ucc.TABLE_NAME = 'DEPT';

-- 테이블 구조 확인
DESC dept_copy;

-- PK : NULL이 입력 불가능하고 중복된 값이 저장될 수 없다
INSERT INTO dept_copy(dept_id, dept_name, create_date) VALUES(10, '테스트', SYSDATE);
-- 제약조건은 수정이 불가능->삭제 후 다시 만들어야 함
ALTER TABLE dept_copy DROP CONSTRAINT dept_copy_dept_id_pk;
-- NOT NULL 제약조건은 MODIFY를 이용하여 수정
ALTER TABLE dept_copy MODIFY create_date NULL;

/*
    3)테이블명/컬럼명/제약조건명 변경
        3-1)컬럼명 변경
            ALTER TABLE 테이블명 RENAME COLUMN 기존컬럼명 TO 변경할 컬럼명;
        3-2)제약조건의 이름 변경
            ALTER TABLE 테이블명 RENAME CONSTRAINT 기존제약조건명 TO 변경할제약조건명
        3-3)테이블의 명칭을 변경
            (1)ALTER TABLE 테이블명 RENAME TO 변경할 테이블명;
            (2)RENAME 기존테이블명 TO 변경할 테이블명;
*/
-- 기본키 제약조건을 설정하려고 하는데 데이터가 중복되어 있는경우
-- 검증할 수 없습니다. <- 잘못된 기본 키입니다 오류발생
-- 식별키
ALTER TABLE dept_copy2 ADD CONSTRAINT dept_copy2_dept_id PRIMARY KEY(dept_id);
-- 컬럼의 이름을 수정
ALTER TABLE dept_copy2 RENAME COLUMN dept_name TO dept_title;
-- 제약조건의 명칭을 수정
ALTER TABLE dept_copy2 RENAME CONSTRAINT SYS_C0011140 TO dept_title_nn;
-- 테이블 명칭을 변경
-- dept_copy2 -> dept_test
ALTER TABLE dept_copy2 RENAME TO dept_test;
SELECT * FROM dept_test;
RENAME dept_test TO dept_copy;

DROP TABLE dept_copy;

'Study > SQL' 카테고리의 다른 글

13.JOIN  (0) 2023.05.05
12.기본키,외래키  (1) 2023.05.04
9.그룹함수  (0) 2023.05.01
8.선택함수  (0) 2023.04.30
7.NULL처리 함수  (0) 2023.04.29

댓글