
DDL(Data Definition Language)은 데이터 정의언어로 객체를 생성(CREATE), 변경(ALTER), 삭제(DROP)하는 구문입니다. 전 포스팅에서는 CREATE에 대해 알아보았으므로 여기서는 나머지에 대해서 알아보겠습니다.
객체를 변경하는 구문입니다.
ALTER TABLE 테이블명 변경할 내용;
변경할 내용에는 아래와 같은 것이 가능합니다.
- 컬럼 추가/수정/삭제
- 제약조건 추가/삭제 --> 수정은 불가(삭제후 다시 추가)
- 컬럼명/제약조건명/테이블명 변경
DEPT_TABLE에 CNAME컬럼 추가
ALTER TABLE DEPT_TABLE ADD CNAME VARCHAR2(20);
LNAME 컬럼 추가(기본값은 '한국'으로 합니다.)
ALTER TABLE DEPT_TABLE ADD LNAME VARCHAR2(20) DEFAULT '한국';
데이터 타입수정 : MODIFY 컬럼명 바꾸고자하는 데이터타입
DEFAULT값 수정 : MODIFY 컬럼명 DEFAULT 바꾸고자하는 기본값
ALTER TABLE DEPT_TABLE MODIFY DEPT_ID CHAR(5); -- CHAR(2) -> CHAR(5)
--ALTER TABLE DEPT_TABLE MODIFY DEPT_ID NUMBER; -- CHAR(2) -> 형식오류 발생
--ALTER TABLE DEPT_TABLE MODIFY DEPT_TITLE VARCHAR2(10); -- CHAR(2) -> 크기오류 발생
DEPT_TITLE 칼럼을 VARCHAR2(40)로 변경
ALTER TABLE DEPT_TABLE MODIFY DEPT_TITLE VARCHAR2(40);
LNAME 컬럼의 기본값을 '미국'으로 변경
ALTER TABLE DEPT_TABLE MODIFY LNAME DEFAULT '미국';
다중변경 역시 가능합니다.
ALTER TABLE DEPT_TABLE
MODIFY DEPT_TITLE VARCHAR2(40)
MODIFY LNAME DEFAULT '미국';
DROP COLUMN 삭제하고자하는 컬럼
우선 DEPT_COPY로 복사 해놓고 진행합니다.
CREATE TABLE DEPT_COPY
AS SELECT * FROM DEPT_TABLE;
현재 DEPT_ID, DEPT_TITLE, LOCATION_ID, CNAME, LNAME 컬럼이 존재하는데, 하나씩 지워보겠습니다.
ALTER TABLE DEPT_COPY DROP COLUMN DEPT_ID;
ALTER TABLE DEPT_COPY DROP COLUMN CNAME;
ALTER TABLE DEPT_COPY DROP COLUMN LNAME;
ALTER TABLE DEPT_COPY DROP COLUMN DEPT_TITLE;
현재 조회해보면 LOCATION_ID 컬럼 하나만 존재합니다.
SELECT * FROM DEPT_COPY; -- LOCATION_ID 하나 존재
여기서 마지막 하나까지 지우면 오류가 발생합니다.
ALTER TABLE DEPT_COPY DROP COLUMN DEPT_COPY;
--> (오류)최소 한개의 컬럼은 존재해야한다.
ALTER TABLE DEPT_COPY DROP COLUMN DEPT_COPY
오류 보고 -
ORA-00904: "DEPT_COPY": invalid identifier
00904. 00000 - "%s: invalid identifier"
칼럼 대신 제약 조건도 추가/삭제가 가능합니다. 수정은 삭제하고 다시 추가하는 것으로 대체합니다.
각종 제약조건을 추가하는 방법은 아래와 같습니다.
PRIMARY KEY:ALTER TABLE 테이블명 ADD PRIMARY KEY(컬럼명);
FOREIGN KEY:ALTER TABLE 테이블명 ADD FOREIGN KET(컬럼명) REFERENCES 참조할 테이블명[(참조할컬럼명)]
UNIQUE:ALTER TABLE 테이블명 ADD UNIQUE(컬럼명);
CHECK:ALTER TABLE 테이블명 ADD CHECK(컬럼에 대한 조건식);
NOT NULL:ALTER TABLE 테이블명 MODIFY 컬럼명 NOT NULL;
제약조건명 지정하고자 한다면 [CONSTRAINT 제약조건명] 제약조건 으로 합니다. 예시로 보도록 하겠습니다.
DEPT_TABLE에서
DEPT_ID에 PRIMARY_KEY 제약조건 추가
DEPT_TITLE에 UNIQUE 제약조건 추가
LNAME에 NOT NULL 제약조건 추가
ALTER TABLE DEPT_TABLE
ADD CONSTRAINT DTABLE_PK PRIMARY KEY(DEPT_ID)
ADD CONSTRAINT DTABLE_UQ UNIQUE(DEPT_TITLE)
MODIFY LNAME CONSTRAINT DTABLE_NN NOT NULL ;
DROP CONSTRAINT 제약조건명
참고로 NOT NULL 제약조건은 삭제가 되지 않습니다. NOT NULL을 NULL 가능으로 변경하고 싶다면 이는 MODIFY로 바꾸어야 합니다.
ALTER TABLE DEPT_TABLE DROP CONSTRAINT DTABLE_PK;
ALTER TABLE DEPT_TABLE
DROP CONSTRAINT DTABLE_UQ
MODIFY LNAME NULL;
테이블 삭제를 할 때 쓰이는 구문입니다.
DROP TABLE DEPT_TABLE;
--어딘가에 참조되고 있는 부모테이블은 함부로 삭제가되지 않는다.
--만약 지우고자 한다면
-- 1. 자식테이블 먼저 삭제 후 삭제
-- 2. 그냥 부모테이블만 삭제하는데 제약조건까지 삭제하는 방법
-- DROP TABLE 테이블명 CASCADE CONSTRAINT;
컬럼명/제약조건명/테이블명 변경시 ALTER와 함께 사용됩니다.
RENAME COLUMN 기존컬럼명 TO 바꿀 컬럼명
DEPT_TITLE 컬럼을 DEPT_NAME로 변경 :
ALTER TABLE DEPT_TABLE RENAME COLUMN DEPT_TITLE TO DEPT_NAME;
RENAME CONSTRAINT 기존제약조건명 TO 바꿀제약조건명
ALTER TABLE DEPT_TABLE RENAME CONSTRAINT SYS_C007221 TO DTABLE_LID_NN;
RENAME TO 바꿀테이블명
ALTER TABLE DEPT_TABLE RENAME TO DEPT_TEST;
테이블 초기화하는 구문으로 DROP과는 다르게 테이블의 데이터만을 전부 삭제하여 테이블의 초기상태로 돌려줍니다.
TRUNCATE TABLE DEPT_TEST;
SELECT * FROM DEPT_TEST;
DROP TABLE DEPT_TEST;
DROP TABLE DEPT_COPY;