# 데이터베이스/오라클

default 초기치 부여, sequence, index, 칼럼 추가,수정,삭제, 이름변경

dev-jjong 2013. 3. 18. 21:36

--default : 특정 칼럼에 초기치 부여  : 열값이 없는 형을 삽입할 경우 열에

                                                  null 값이 입력되는 것을 방지
create table aa(bun number(6), irum varchar2(20) default '종로구 숭인동');
insert into aa(bun, irum) values(1, '역삼1동');
insert into aa(bun) values(2);  --디폴트를 준 '종로구 숭인동'이 null값을 채워준다.
select * from aa;
drop table aa;
 
 -- sequence : number 칼럼에 대해 숫자를 자동증가

    (sequence는 오라클에서만 쓴다. 다른데서는 auto increment)
create sequence my_bun increment by 1 start with 10 maxvalue 1000 cycle;   -- 10부터 시작하고 1씩 증가, 1000까지, 그리고 minvalue, nocycle 도 있다.
                                                                     --cycle : 1000이 넘어가면 다시 1로 초기화 된다.
select sequence_name, min_value, max_value, increment_by from user_sequences;   --오라클이 가지고있는 명령을 가지고 만들것을 증명해보기 위한것. 몰라도 된다.

create table aa(bun number primary key, irum varchar2(10) not null);
insert into aa values(my_bun.nextval, '이겨라'); --user_sequence 적용
insert into aa values(my_bun.nextval, '신선해');
insert into aa values(my_bun.nextval, '사오정');
insert into aa values(my_bun.nextval, '손오공');   --sequence는 13까지 자동으로 줬기때문에 다음 차례인 14번을 기억한다.
insert into aa values(19, '저팔계');             -- 여기서 14번을 프로그래머가 주게되면
insert into aa values(my_bun.nextval, '손오공');   -- 에러 : 이번에 오는 sequence는 14번을 자동입력해주려고 하기때문에 에러
drop table student;
select * from aa;
alter sequence my_bun increment by 1; - -- sequence 수정
create table bb(no number primary key, name varchar2(10), weight number(3));
insert into bb values(1,'한사람', 50);
insert into bb values(my_bun.nextval,'한사람', 50);  --sequence는 복수 개의 테이블에 적용
insert into bb values(23,'두사람', 53); 
select * from bb;
insert into bb values(19,'두사람', my_bun.nextval); --sequence는 pk하고 관련 없다.

drop sequence code_bun;    --sequence 삭제

 

------------ < sequence 연습문제 > ----------
create sequence code_bun increment by 1 start with 1 maxvalue 1000;  
create table kyosu(kyo_code number(10) primary key, kyo_name varchar2(10), kyo_room number(4) check(kyo_room >= 100 and kyo_room<=500));
insert into kyosu values(11111, '가교수', 100);
insert into kyosu values(22222, '나교수', 200);
insert into kyosu values(33333, '다교수', 300);
insert into kyosu values(44444, '라교수', 400);
select * from kyosu;

create table kuamok(kuamok_code number(10) primary key, kuamok_name varchar2(20) unique, kyojae_name varchar2(20), damdang_kyosu number(10) references kyosu(kyo_code));
insert into kuamok values(code_bun.nextval, 'java', '자바의정석',11111);
insert into kuamok values(code_bun.nextval, 'oracle', '오라클',33333);
insert into kuamok values(code_bun.nextval, 'c++', 'c++열혈강의',33333);
insert into kuamok values(code_bun.nextval, 'linux', '리눅스마스터',44444);
select * from kuamok;

 

create table student(hakbun number(10) primary key, hak_name varchar2(10), sugang number(10), haknyeon number(1) default '1' check (haknyeon>=1 and haknyeon>=4) , constraint hak foreign key(sugang) references kuamok(kuamok_code));
insert into student(hakbun, hak_name, sugang) values(2013001, '가종현', 00004);
insert into student values(2013002, '나자균', 00003, 1);
insert into student(hakbun, hak_name,haknyeon, sugang) values(2013003, '다승원', 4, 00002);
insert into student(hakbun, hak_name, sugang) values(2013004, '라민철', 00004);
insert into student values(2013005, '마동수', 00003, 1);
insert into student values(2013006, '바슬람', 00002, 3);

select * from student;


---------------------------------------------문제 끝---------------------

 

 

create sequence my_seq;      -- 이렇게 막아버리면 자동으로 1부터 1씩 증가하게 된다. 그리고 노사이클! 편하게갈때는 요렇게 가자.
drop sequence my_seq;    --create로 만들었기때문에 drop으로 지워야한다.

--index(색인) : 검색(query, 질의) 속도 증진을 위해 특정 칼럼에게 색인을 붙일 수 있다.
             -- 추가, 수정, 삭제가 빈번한 테이블의 경우에는 사용하지 않는 것이 바람직하다.
               
select * from aa;
create index ind_irum on aa(irum);
select index_name, table_name from user_indexes where table_name='AA';
alter index ind_irum rebuild;    --자료의 추가, 수정, 삭제 후에 색인을 갱신한다.
drop index ind_irum;     --색인 삭제

--테이블 관련 명령


create table 테이블명...
alter table 테이블명...
drop table 테이블명...
rename 옛이름 to 새이름;
select * from aa;
rename aa to newaa;    --rename : 테이블 이름 바꾸기
select * from newaa;
desc newaa;    --describe newaa;  오라클에서만 쓸 수 있는 명령어다.
rename newaa to aa;


--칼럼 관련 명령
--(1)칼럼추가
alter table aa add(job_id number(6) default 10);  --칼럼이 추가되면서 디폴트 값인 10이다 채워진다.
alter table aa add(nai number(2));        -- 초기치를 안줬기때문에 새로만들어지는 nai는 모두 null이된다.
select * from aa;

--(2)칼럼수정
alter table aa modify(job_id number(2));   -- 에러 : (6) 자리의 데이터가 들어있기때문에 (2)로 축소해서 수정하게되면 에러가 난다. 불가.즉, 기존자료가 손상을 입을 수 있기 때문에.
alter table aa modify(job_id number(8));   -- 성공 : 크기의 확대만 가능하다. 그렇기때문에 (6) -> (8)로 수정 가능!
 

--(3)칼럼 이름 변경
alter table aa rename column job_id to job_no;   -- 성공


--(4)칼럼 삭제
alter table aa drop (job_no);  --성공 : 괄호가 있어야한다. 주의.
desc aa;

alter table aa set unused(nai);  --unused : 칼럼의 비활성화. select로 검색해도 안나온다.
                                  --비활성화 시켜두게 되면, 현재 사용자들은 그대로 사용이되고, 명령시점이후에 사용자들에겐 안보이게된다. 그리고  해당 칼럼을 사용하던 사람들이 사용하지 않을때 DB를 지우기 위함이다.
alter table aa drop unused columns;  --unused된 칼럼들만 모두 지워준다.

--자료의 별도 보관 : backup. 단순한 backup 효과를 발휘 명령
cmd 창에서 exp, imp 한다.
export방법
cmd -> c:\ 으로 이동 ->   exp scott/tiger tables=emp,dept, aa file=scott.dmp 친다.
drop table aa;
select * from aa;
import방법
cmd -> c:\ 으로 이동 ->   imp scott/tiger tables=emp,dept, aa file=scott.dmp  --단, 테이블이 존재하고있으면 import가 안된다. 없는 테이블만 import시켜준다.
select * from aa;

select * from tab;   --select * from tab : oracle의 table 목록을 다 표시해주는 테이블
drop table aa;  --삭제를 하게되면 완전삭제의 개념이 아니고, 오라클의 휴지통에 들어가 있는 개념이다.


----------------------밑에는 오라클에서만 먹히는 명령. 다른데서는 명령이 다름.-------------
show recyclebin;  --휴지통 목록 확인(단 여기서는 실행이 안되고, 커멘드창에서 실행해야함.
flashback table aa to before drop;  -- 휴대통에 테이블 복원.
purge recyclebin; -- 휴지통 비우기! 완전 삭제~~~~~~
drop table from aa; --테이블 한번에 완전 삭제!! 강력한 명령. 위험함