본문 바로가기
DataBase/Oracle

DDL) ALTER 구문 (ADD, MODIFY, RENAME, DROP)

by 박채니 2022. 4. 26.

안녕하세요, 코린이의 코딩 학습기 채니 입니다.

 

개인 포스팅용으로 내용에 오류 및 잘못된 정보가 있을 수 있습니다.


ALTER

- table 객체에 대한 alter 구문은 컬럼/제약조건에 대한 수정 시 사용

 

sub 명령어

① add : 컬럼/제약조건 추가

② modify : 컬럼 (자료형, default값, not null) 변경 (제약 조건은 변경 불가(

③ rename : 컬럼/제약조건에 대한 이름 변경

④ drop : 컬럼/제약조건 삭제

 


ADD

- 컬럼 추가

- 테이블의 마지막 컬럼 순서로 추가 가능

 

컬럼 추가

create table tb_user(
    no number,
    id varchar2(20),
    password varchar2(20)
);

alter table
    tb_user
add
    name varchar2(50) default '홍길동' not null;   -- 제약 조건도 추가 가능

desc tb_user;
select * from user_tab_columns where table_name = 'TB_USER';

varchar2(50)의 name이라는 컬럼을 추가하였으며, default 값과 not null 제약 조건도 같이 추가하였습니다.

 

제약 조건 추가

-- 제약 조건 추가
alter table
    tb_user
add 
    constraint pk_tb_user_no primary key(no);
    
select * from user_constraints where table_name = 'TB_USER';

no컬럼에 대해서 PK 설정을 하였습니다.

 

더보기

제약 조건 추가할 때

"ORA-00955: name is already used by an existing object" 이와 같은 에러메세지가 떴습니다.

SELECT OBJECT_NAME, OBJECT_TYPE
FROM USER_OBJECTS
WHERE OBJECT_NAME LIKE '%[테이블명]%'

위의 쿼리로 오류가 발생한 테이블의 object를 조회하여, 실습하며 생성했던 tb_user에서 tb_userrrr로 이름을 변경했던 테이블에 no 컬럼에 대해서 PK가 존재하고 있어서 발생한 오류로 보여, tb_userrrr 테이블을 drop하여 오류를 해결하였습니다.

 


MODIFY

- 컬럼에 대해서만 수정 (자료형, default값, not null)

alter table
    tb_user
modify
    name varchar2(150) default '' null;
-- default '' / default null -> 기본값 제거
-- not null -> null
    
desc tb_user;
select * from user_constraints where table_name = 'TB_USER';	--not null 확인
select * from user_tab_columns where table_name = 'TB_USER';	--default값 확인

name에는 기존에 default 값, not null 제약 조건이 설정 되어있었습니다.

이를 default '' null로 기본 값 제거 및 not null → null로 변경하였습니다.

 

not null 설정했던 (constraint_name : SYS_C007673) 것과 default 설정 했던 것이 없어진 것을 알 수 있죠.

 

insert into
    tb_user(no, id, password)
values (1, 'honggd', '1234');

select * from tb_user;

 

 

컬럼 값이 varchar2(10)이고, 10byte 데이터가 있는 상황에서 varchar2(5)로 변경 가능? 불가!!!
컬럼 값이 varchar2(10)이고, 10byte 데이터가 있는 상황에서 varchar2(15)로 변경 가능? 가능!!!

 


RENAME

- 컬럼명 및 제약 조건명 변경

 

컬럼명 변경

alter table
    tb_user
rename column password to pw;

desc tb_user;

 

제약 조건명 변경

alter table
    tb_user
rename constraint PK_TB_USER_NO to pk_tb_user;

select * from user_constraints where table_name = 'TB_USER';

@실습문제

tb_user에 gender 컬럼 추가 char(1) M, F 허용하는 제약 조건 추가

alter table
    tb_user
add
    gender char(1)
add
    constraint ck_tb_user_gender check(gender in('M', 'F'));
    
desc tb_user;
select * from user_constraints where table_name = 'TB_USER';

 


TABLE RENAME

- 테이블명 변경

alter table
    tb_user
rename to tb_user_2;

select * from tb_user;  -- ORA-00942: table or view does not exist
select * from tb_user_2;

테이블명 또한 변경할 수 있으며, 이전 테이블을 조회하려고 하니 "ORA-00942: table or view does not exist" 테이블을 찾을 수 없다는 에러 메세지가 출력됩니다.

 


DROP

- 컬럼 삭제

- 제약 조건 삭제 : 대상 컬럼 변경, 제약 조건 타입 변경 등은 불가하므로 삭제 후 재생성!

 

제약 조건 삭제

alter table
    tb_user_2
drop constraint CK_TB_USER_GENDER;

select * from user_constraints where table_name = 'TB_USER_2';

 

컬럼 삭제

alter table
    tb_user_2
drop column gender;

desc tb_user_2;