국비/Oracle

[04-2] Oracle DDL (ALTER, DROP)

박머루 2022. 5. 6. 20:28
DDL (DATA DEFINITION LANGUAGE) 데이터 정의 언어
객체들을 새로이 생성CREATE, 수정ALTER, 삭제DROP 하는 구문
ALTER : 객체 구조를 수정하는 구문
<테이블수정>
ALTER TABLE 테이블명 수정할내용;

- 수정할 내용
    1) 컬럼 추가 / 수정 / 삭제
    2) 제약조건 추가 / 삭제 => 수정은 불가(수정하고자하면 삭제 후 새롭게 추가)
    3) 테이블명 / 컬럼명 / 제약조건명 변경
ADD 컬럼 추가
--  ADD 추가할컬럼명 데이터타입 /*DEFAULT 기본값 (생략가능)*/
-- CNAME 컬럼 추가
ALTER TABLE DEPT_COPY ADD CNAME VARCHAR2(20);
-- 새로이 컬럼이 만들어지고 NULL값이 기본적으로 채워진다

-- LNAME 컬럼 추가 DEFAULT 지정해서 '한국'으로 넣어보자
ALTER TABLE DEPT_COPY ADD LNAME VARCHAR2(20) DEFAULT'한국';
-- 새로이 컬럼이 만들어지고 NULL이 아닌 DEFAULT값으로 채워짐
MODIFY 컬럼 수정
-- 데이터 타입 수정 : MODIFY 수정할컬럼명 바꾸고자하는데이터타입
-- DEFAULT 값 수정 : MODIFY 수정할컬럼명 DEFAULT 바꾸고자하는기본값
-- DEPT_ID 컬럼의 데이터 타입을 CHAR(3)로 변경
ALTER TABLE DEPT_COPY MODIFY DEPT_ID CHAR(3);

-- 현재 변경하고자 하는 컬럼에 이미 담겨있는 값과 완전히 다른 타입으로 변경은 불가능하다
-- 예) 문자 -> 숫자 (X) / 문자열 사이즈 축소(X) / 문자열 사이즈 확대(O)

ALTER TABLE DEPT_COPY MODIFY DEPT_ID NUMBER;
ALTER TABLE DEPT_COPY MODIFY DEPT_TITLE VARCHAR2(10);

-- DEPT_TITLE 컬럼의 데이터타입을 VARCHAR2(40)로
-- LOCATION_ID 컬럼의 데이터타입을 VARCHAR2(3)로
-- LNAME 컬럼의 기본값을 '미국'으로 변경

ALTER TABLE DEPT_COPY 
MODIFY DEPT_TITLE VARCHAR2(40)
MODIFY LOCATION_ID VARCHAR2(3)
MODIFY LNAME DEFAULT '미국';
-- 데이터 자체를 바꾸는게 아니라 기본값을 바꾸는 것!
-- 앞으로 INSERT 된 값들의 기본값이 '미국'
DROP COLUMN 컬럼 삭제
-- DROP COLUMN 삭제하고자하는컬럼명
-- 전체 컬럼을 모두 삭제할 수는 없다, 마지막 컬럼은 삭제 못함
ALTER TABLE DEOT_COPY2 DROP COLUMN DEPT_ID;
ROLLBACK;
-- DDL 구문은 복구 불가능 택도없다!~!
제약조건 추가 / 삭제
    1) 제약조건 추가
    
    PRIMARY KEY : ADD PRIMARY KEY(컬럼명);
    FOREIGN KEY : ADD FOREIGN KEY(컬럼명) REFERENCES 참조할테이블명(참조할컬럼명);
    UNIQUE : ADD UNIQUE(컬럼명);
    CHECK : ADD CHECK(컬럼명);
    NOT NULL : MODIFY 컬럼명 NOT NULL;

    2) 제약조건 삭제
    
    PRIMARY KEY, FOREIGN KEY, UNIQUE, CHECK : DROP CONSTRAINT 제약조건명
    NOT NULL : MODIFY 컬럼명 NULL

-- DCOPY_PK 제약조건 지우기
ALTER TABLE DEPT_COPY DROP CONSTRAINT DCOPY_PK;

-- LNAME 제약조건 지우기 NOT NULL => NULL

ALTER TABLE DEPT_COPY MODIFY LNAME NULL;
컬럼명 / 제약조건명 / 테이블명 변경(RENAME)
-- 컬럼명 변경 : RENAME COLUMN 기준컬럼명 TO 바꿀컬럼명;

-- 제약조건명 변경 : RENAME CONSTRAINT 기존제약조건명 TO 바꿀제약조건명;

-- 테이블명 변경 : RENAME 기존테이블명 TO 바꿀테이블명;

-- 컬럼명 변경
ALTER TABLE DEPT_COPY RENAME COLUMN DEPT_TITLE TO DEPT_NAME;

-- 제약조건명 변경
ALTER TABLE DEPT_COPY RENAME CONSTRAINT SYS_C009038 TO DCOPY_LID_NN;

-- 테이블명 변경
ALTER TABLE DEPT_COPY RENAME TO DEPT_TEST;

 

 

DROP
객체를 삭제하는 구문
DROP TABLE DEPT_TEST;
ROLLBACK; -- 롤백 안먹히니 조심해서 사용해라

-- 어딘가에서 참조되고 있는 부모테이블은 삭제되지 않는다

-- 1. 자식테이블을 먼저 삭제한 후 부모테이블을 삭제한다.
DROP TABLE 자식테이블;
DROP TABLE 부모테이블;

-- 2. 부모테이블만 삭제하는데 맞물려있는 제약조건도 함께 삭제하는 법
DROP TABLE 부모테이블 CASCADE CONSTRAINT;