DB/SQL

DDL(ALTER_DROP)

이파댥 2024. 7. 10. 20:26
-- DDL(DATA DEFINITION LANGUAGE)
-- 데이터 정의 언어로 객체를 만들고(CREATE) 수정하고(ALTER) 삭제(DROP) 구문

-- ALTER(바꾸다, 수정하다)
-- 수정가능한 것 컬럼(추가/수정/삭제) 제약조건(추가/삭제) 이름변경(테이블,컬럼,제약조건)

-- [작성법]
-- 테이블을 수정하는 경우
-- ALTER TABLE 테이블명 ADD / MODIFY / DROP 수정할 내용;

-- 1. 제약조건 추가 / 삭제

-- 작성하는 방법 중 [ ] : 생략 가능(선택)
-- 제약조건 추가 : ALTER TABLE 테이블명
--              ADD [CONSTRAINT 제약조건명] 제약조건(컬럼명) [REFERENCES 테이블명(컬럼명)];
                        
-- DEPARTMENT 테이블을 복사해서 예제 진행

CREATE TABLE DEPT_COPY AS SELECT * FROM DEPARTMENT;

-- DEPT_COPY 테이블에 PK PRIMARY KEY 추가
ALTER TABLE DEPT_COPY ADD CONSTRAINT DEPT_COPY_PK PRIMARY KEY(DEPT_ID);
--> ALTER TABLE DEPT_COPY : 테이블을 수정하겠다
--> ADD CONSTRAINT : 새로운 제약조건을 추가하는 값
--> DEPT_COPY_PK : 새로운 제약조건의 이름
--> PRIMARY KEY(DEPT_ID) : DEPT_ID 를 기본키로 설정

-- DEPT_COPY 테이블에서 DEPT _TITLE 컬럼에 UNIQUE 제약 조건 추가
-- CONSTRAINT 제약조건 이름 DEPT_COPY_UNI

ALTER TABLE DEPT_COPY ADD CONSTRAINT DEPT_COPY_UNI UNIQUE(DEPT_TITLE);


-- 2. 컬럼 추가 / 수정 / 삭제

-- 컬럼 추가 : ALTER TABLE 테이블명 ADD(컬럼명 데이터타입 [DEFAULT] '값');

-- 컬럼 수정 : ALTER TABLE 테이블명 MODIFY 컬럼명 데이터타입;  : 데이터타입을 변경
--           ALTER TABLE 테이블명 MODIFY DEFAULT '값';  : 기본값 변경

---> 데이터 타입 수정할 경우 컬럼에 저장된 크기 미만으로는 변경할 수 없음
----> 데이터 타입을 VARCHAR2(100) -> VARCAHR(10) 하면 데이터 타입이 10 초과되는건 불가

-- 컬럼 삭제 : ALTER TABLE 테이블명 DROP(삭제할컬럼명);
-->          ATLER TABLE 테이블명 DROP COLUMN 삭제할컬럼명;

--> 테이블에는 최소 한 개 이상의 컬럼이 존재해야하기 때문에 모든 컬럼을 삭제 X

-- DEPT_COPY 컬럼에 CNAME VARCHAR2(20) 컬럼 추가

SELECT * FROM DEPT_COPY;

ALTER TABLE DEPT_COPY ADD (CNAME VARCHAR2(20));

-- DEPT_COPY 테이블에 LNAME 추가 VARCHAR2(30) 기본값은 한국으로 추가
ALTER TABLE DEPT_COPY ADD (LNAME VARCHAR2(30) DEFAULT '한국');

SELECT * FROM DEPT_COPY;

-- (수정)
-- DEPT_COPY 테이블의 DEPT_ID 컬럼의 데이터 타입을 CHAR(2) -> VARCHATR(3) 으로 변경
ALTER TABLE DEPT_COPY MODIFY DEPT_ID VARCHAR2(3);
--> 주의할 점 : 기존에 저장된 컬럼값이 3 보다 크면 변경 불가
----> 컬럼값을 조절할 때 (큰 값 -> 작은 값) 이미 저장된 데이터값이 변경할 값보다 크지 않은지는 확인하고 조절

-- (삭제)
-- DEPT_COPY 테이블에서 CNAME,LNAME 을 삭제
ALTER TABLE DEPT_COPY DROP(CNAME);

ALTER TABLE DEPT_COPY DROP COLUMN LNAME;

SELECT * FROM DEPT_COPY;

--> DEPT_TITLE 컬럼 1 번 방법 삭제
ALTER TABLE DEPT_COPY DROP(DEPT_TITLE);

--> LOCATION_ID 컬럼 2번 방법 삭제
ALTER TABLE DEPT_COPY DROP COLUMN LOCATION_ID;

SELECT * FROM DEPT_COPY;


-- 3. 테이블 삭제
-- [작성법]
-- DROP TABLE 테이블명 [CASCADE CONSTRAINTS];

-- 삭제할 테이블 TB1 생성
CREATE TABLE TB1(TB1_PK NUMBER PRIMARY KEY,
                 TB1_COL NUMBER
                 );

-- 삭제할 테이블 TB2 생성
CREATE TABLE TB2(TB2_PK NUMBER PRIMARY KEY,
                 TB2_COL NUMBER REFERENCES TB1 -- TB1 테이블의 PK 값을 참조
                 );

-- 일반 삭제 (DEPT_COPY)
DROP TABLE DEPT_COPY; -- Table DEPT_COPY이(가) 삭제되었습니다.

SELECT * FROM DEPT_COPY;

DROP TABLE TB1;
-- ORA-02449: unique/primary keys in table referenced by foreign keys
-- 왜래 키에 의해 참조되는 고유 / 기본 키가 존재하기 때문에 삭제할 수 없음
-- 삭제하고 싶은데 어떻게 삭제를 하는가 

-- 해결방법 1 : 자식 테이블(TB2) 삭제 후 부모테이블(TB1) 을 삭제하기
DROP TABLE TB2;
DROP TABLE TB1;

-- 해결방법 2 : CASCADE CONSTRAINTS 옵션 사용
--> 제약조건까지 모두 삭제 조건을 없애버려서 부모 자식 끊음
DROP TABLE TB1 CASCADE CONSTRAINTS;
DROP TABLE TB2 CASCADE CONSTRAINTS;
SELECT * FROM TB1;
SELECT * FROM TB2;

-- 4. 제약조건 컬럼 테이블 이름 변경 (RENAME)
    
-- 테이블 복사
-- ALTER TABLE 테이블명 RENAME TO 새로운테이블명;
CREATE TABLE DEPT_COPY AS SELECT * FROM DEPARTMENT;

ALTER TABLE DEPT_COPY RENAME TO DCOPY;

SELECT * FROM DCOPY; 
SELECT * FROM DEPT_COPY;