DB

DB (8) DDL(ALTER, DROP)

동동이임 2023. 6. 10. 21:25

▶ ALTER

- 객체 구조를 수정해 주는 구문

<테이블 수정>
[표현법]
ALTER 객체명(TABLE, INDEX, USER, ...) 테이블명 수정할내용;

- 수정할 내용
    1) 컬럼 추가/수정/삭제
    2) 제약조건 추가/삭제 => 수정은 안된다.(수정하고자 한다면 삭제 후 새롭게 추가해야 한다.)
    3) 테이블명/컬럼명/제약조건명 수정가능하다.

 

■ 컬럼 추가 / 수정 / 삭제

● 컬럼 추가(ADD) 

[표현법]
ADD 추가할컬럼명 자료형 [DEFAULT 기본값]

ex)

-- CNAME 컬럼 추가하기
ALTER TABLE DEPT_COPY ADD CNAME VARCHAR2(20);
-- 새로운 컬럼이 추가되고 NULL값으로 채워졌다.

-- LNAME 컬럼 추가하기 DEFAULT값으로 '한국' 이라고 지정하기
ALTER TABLE DEPT_COPY ADD LNAME VARCHAR2(20) DEFAULT '한국';

 

컬럼 수정(MODIFY) 

[표현법]
컬럼의 자료형 수정 : MODIFY 수정할 컬럼명 바꾸고자하는 자료형
DEFAULT값 수정시 : MODIFY 수정할 컬럼명 DEFAULT 바꾸고자하는 기본값

- 문자 => 숫자(X) / 사이즈 축소(X) / 사이즈 확대(O)

- 한 번에 여러 개의 컬럼 변경이 가능하다.

ex)

-- DEPT_COPY테이블의 DEPT_ID의 자료형을 CHAR(3)로 변경
ALTER TABLE DEPT_COPY MODIFY DEPT_ID CHAR(3);

-- 현재 변경하고자하는 컬럼에 이미 담겨있는 값과 완전히 다른 타입으로 변경해보기(불가능)
ALTER TABLE DEPT_COPY MODIFY DEPT_ID NUMBER;
-- column to be modified must be empty to change datatype

-- 현재 변경하고자하는 컬럼에 이미 담겨있는 값보다 더 작은 크기로 변경해보기(불가능)
ALTER TABLE DEPT_COPY MODIFY DEPT_ID CHAR(1);
-- cannot decrease column length because some value is too big

-- DEPT_TITLE 컬럼의 데이터 타입을 VARCHAR2(40)로 변경
-- LOCATION_ID 컬럼의 데이터타입을 VARCHAR2(2)로
-- LNAME 컬럼의 기본값을 '미국'으로 변경
ALTER TABLE DEPT_COPY
MODIFY DEPT_TITLE VARCHAR2(40)
MODIFY LOCATION_ID VARCHAR(2)
MODIFY LNAME DEFAULT '미국';

 

컬럼 삭제(DROP COLUMN)

[표현법]
DROP COLUMN 삭제하고자하는 컬럼명

ex)

-- DEPT_COPY2 테이블에 DEPT_ID 컬럼 지우기
ALTER TABLE DEPT_COPY2 DROP COLUMN DEPT_ID;

-- 모든 컬럼 지워보기
ALTER TABLE DEPT_COPY2 DROP COLUMN DEPT_TITLE;
ALTER TABLE DEPT_COPY2 DROP COLUMN LOCATION_ID;
ALTER TABLE DEPT_COPY2 DROP COLUMN CNAME;
ALTER TABLE DEPT_COPY2 DROP COLUMN LNAME;
-- cannot drop all columns in a table
-- 마지막 컬럼은 삭제할 수 없다.

※ 모든 DDL문 전체는 ROLLBACK으로 복구가 안된다.

 

■ 제약조건 추가 / 삭제

제약조건 추가

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

- 나만의 제약조건명을 부여하고자 한다면 CONSTRAINT 제약조건명 앞에다 붙이면 된다.

ex)

-- DEPT_COPY 테이블로부터
-- DEPT_ID 컬럼에 PRIMARY KEY 제약조건 추가
-- DEPT_TITLE 컬럼에 UNIQUE 제약조건 추가
-- LNAME 컬럼에 NOT NULL 제약조건 추가
ALTER TABLE DEPT_COPY 
ADD CONSTRAINT DCOPY_PK PRIMARY KEY(DEPT_ID)
ADD CONSTRAINT DCOPY_UQ UNIQUE(DEPT_TITLE)
MODIFY LNAME CONSTRAINT DCOPY_NN NOT NULL;

 

제약조건 삭제

[표현법]
PRIMARY KET, FOREIGN KEY, UNIQUE, CHECK : DROP CONSTRAINT 제약조건명
NOT NULL                                                                : MODIFY 컬럼명 NULL;

 

■ 컬럼명 / 제약조건명 / 테이블명 변경(RENAME)

컬럼명 변경

[표현법]
RENAME COLUMN 기존컬럼명 TO 바꿀컬럼명

ex)

-- DEPT_COPY 테이블에서 DEPT_TITLE을 DEPT_NAME으로 바꾸기
ALTER TABLE DEPT_COPY RENAME COLUMN DEPT_TITLE TO DEPT_NAME;

 

 제약조건명 변경

[표현법]
RENAME CONSTRAINT 기존제약조건명 TO 바꿀제약조건명

ex)

-- DEPT_COPY 테이블에서 SYS_C007141을 DCOPY_DID_NN로 바꾸기
ALTER TABLE DEPT_COPY RENAME CONSTRAINT SYS_C007141 TO DCOPY_DID_NN;

 

테이블명 변경

[표현법]
RENAME [기존테이블명] TO 바꿀테이블명

ex)

-- DEPT_COPY 테이블 이름을 DEPT_TEST로 변경
ALTER TABLE DEPT_COPY RENAME /*DEPT_COPY*/ TO DEPT_TEST; -- 기존 테이블 이름이 이미 나왔으므로 생략이 가능하다.

 

▶ DROP

- 객체를 삭제하는 구문

[표현법]
DROP TABLE 삭제하고자하는 테이블이름

 

부모테이블 삭제

- 어디선가 참조되고 있는 부모테이블들은 삭제되지 않는다.

 

방법 1. 자식테이블을 먼저 삭제한 후 부모테이블을 삭제한다면 된다.

방법 2. 부모테이블만 삭제하되, 맞물려있는 외래키 제약조건도 함께 삭제하는 방법