-
[Oracle] DDLDataBase/Oracle 2022. 9. 9. 15:17
DDL(database definition language): 데이터 정의어
제약조건(CONSTRAINT)
1. PRIMARY KEY(기본키)
-테이블에 저장된 레코드를 고유하게 식별하기 위한 기본키, 하나의 테이블에 하나의 기본키만 정의할 수 있음
-테이블을 구성하는 필드들 중 자격이 되는 필드 중 하나에 부여하는 테이블의 대표값이라고 할 수 있음
-테이블을 구성하는 필드들 중에서 갖는 값들이 빈칸(null)이 없고 서로 다른 값(유일한 값. 즉 중복된 값을 갖을 수 없음)을 갖고 있어 레코드들을 유일하게 구분해낼 수 있는 필드를 기본키로 지정함
-기본키를 지정함으로써 기본키가 지정하지 않았을 때 발생할 수 있는 오류들을 미연에 방지할 수 있음
-기본키로 결함을 없애는 것. 그래서 결함없이 유지되는 것을 개체 무결성이라고 부름
-여러 필드가 조합된 기본키 생성 가능함
-PRIMARY KEY=UNIQUE KEY+NOT NULL
2. UNIQUE KEY
-테이블에 저장된 행 데이터를 고유하게 식별하기 위한 고유키를 정의함
-단 NULL은 고유키 제약의 대상이 아니므로, NULL 값을 가진 행이 여러개가 UNIQUE KEY 제약에 위반하지는 않음
3. NOT NULL
-비어있는 상태, 아무것도 없는 상태를 허용하지 않음 -입력 필수
4. CHECK
-입력할 수 있는 값의 범위를 제한함.
-CHECK 제약으로는 TRUE or FALSE로 평가할 수 있는 논리식을 지정함
5. FOREIGN KEY
-테이블 간의 필수 포함 관계에 있어 상대 테이블의 특정 필드값을 참조하면서 없는 값을 사용하지 않는 필드
-관계형 데이터 베이스에서 테이블 간에 관계를 정의하기 위해 기본키를 다른 테이블의 외래키로 복사하는 경우 외래키가 생성됨.
-외래키로 유지되는 무결성을 참조무결성이라고 부름
-외래키가 생성되려면 언급되는 필드들에 연결되는 필드들의 자료형도 일치해야함
데이터 생성(CREATE)
Create Table 테이블이름( 필드명1 DATATYPE[DEFAULT 값 or 제약조건 및 형식], 필드명2 DATATYPE[DEFAULT 값 or 제약조건 및 형식], 필드명3 DATATYPE[DEFAULT 값 or 제약조건 및 형식], ... );
-테이블의 이름은 객체를 의미할 수 있는 적절한 이름을 사용함(자바 변수 이름 규칙과 거의 동일)
-다른 테이블과 중복되지 않게 테이블 이름을 지정함
-한 테이블 내에서 필드이름도 중복되지 않게 함
-각 필드들은 ','로 구분하여 생성함
-create를 비롯한 모든 sql 명령은 ';'로 끝남
-필드명 뒤에 DATATYPE은 반드시 지정하고 [] 안에 내용은 해당내용이 있을 때 작성하며 생략 가능함
-테이블명과 필드명은 반드시 문자로 시작해야 하고 예약어 명령어 등을 테이블명과 필드명으로 쓸 수 없음
-테이블 생성 시 대/소문자 구분은 하지 않음(기본적으로 테이블이나 컬럼명은 대문자로 만들어짐)
-DATE 데이터 형식은 별도로 크기를 지정하지 않음
-문자데이터의 DataType: varchar2(10), 숫자데이터의 데이터타입: number(4)
-문자 데이터 유형은 반드시 가질 수 있는 최대 길이를 표시해야 함
-컬럼과 컬럼의 구분은 콤마로 하되, 작성이 모두 종료되는 마지막 컬럼 또는 제약사항의 내용 뒤에는 콤마를 찍지 않음
-- 도서대여점의 도서목록 테이블의 생성 -- 테이블명: booklist -- 필드: booknum, subject, makeyear, inprice, outprice, rentprice -- 자료형: booknum(문자 5자리), subject(문자 30), makeyear(숫자 4), inprice(숫자 6), rentprice(숫자 6) drop table booklist purge; -- 기존에 있을 수 있는 booklist 테이블을 삭제함 create table booklist( booknum varchar2(5) not null, -- not null: 필드값에 null값이 올 수 없다라는 제약 조건. -- 빈칸으로 놔둘 수 없으니 무엇이든 값을 채워야 함. subject varchar2(30) not null, makeyear number(4) default 2022, inprice number(6) default 0, rentprice number(6) default 0, constraint blist_pk primary key(booknum) -- constaraint: 테이블레벨의 제약조건을 지정하는 키워드 -- blist_pk: 테이블 외부에서 현재 제약조건을 컨트롤 하기 위한 제약조건의 고유이름 -- primary key(booknum): 기본키로 booknum을 지정하겠다는 뜻 -- 제약조건은 필드 옆에 기술하는 필드레벨 제약조건이 있고, -- (subject varchar2(30) not null에서 not null이 필드레벨 제약조건) -- 테이블 생성 명령 마지막에 모아서 쓰는 테이블 레벨의 제약조건이 있음. -- 제약조건은 어디에다 써도 무관함. -- 다만 필드레벨의 제약조건은 해당 필드 옆(오른쪽 제약조건란)에 써야 -- 그 필드에 적용됨 -- 마지막 필드를 또는 기타사항 등을 쓰고 더이상 쓸 내용이 없으면 -- 컴마(,)를 쓰지 않음 ); -- 테이블 생성2 -- 테이블 이름: MemberList(회원리스트) -- 필드: memberNum, memberName, Phone, Birth, Bpoint, joinDate -- 데이터 형식: memberNum: VARCHAR2(5), memberName: VARCHAR2(12), -- phone: VARCHAR2(13), Birth: DATE, Bpoint: NUMBER(6), -- joinDate: DATE -- 제약조건 -- 1. memberNum, memberName, Phone: Not Null 필드레벨로 설정 -- 2. memberNum: Primary Key 테이블 레벨로 설정 -- 3. Bpoint: 기본값 0 -- 4. joinDate: 기본값 sysdate(joindate date default sysdate) drop table memberlist purge; create table memberlist( memberNum varchar2(5) not null, memberName varchar2(12) not null, Phone varchar2(13) not null, Birth date, Bpoint number(6) default 0, joinDate date default sysdate, constraint mlist_pk primary key(memberNum) ); -- 테이블 생성 3 -- 테이블 이름: rentlist -- 필드: rent_date(date), idx(number(3)), bNum(number(5)), -- mNum(number(5)), discount(number(4)) -- 제약조건 -- 1. bNum, mNum: not null -- 2. rent_date: default(오늘 날짜) -- 3. rent_date, idx: 조합에 의한 기본키 설정 drop table rentlist purge; create table rentlist( rent_date date default sysdate, idx number(3) not null, -- 해당일자의 대여순번 bNum varchar2(5) not null, mNum varchar2(5) not null, discount number(4), constraint r_pk primary key(rent_date, idx), -- 두 개의 필드가 조합되어 기본키로 지정될 수 있음. 이를 슈퍼키라고 함 constraint r_fk1 foreign key(bNum) references booklist(booknum), -- rentlist 테이블의 bNum은 -- booklist 테이블의 booknum을 참조하는 외래키로 지정 -- (제약조건이름 r_fk1) constraint r_fk2 foreign key(mNum) references memberlist(memberNum) -- renlist 테이브르이 mNum은 -- memberlist 테이블의 memberNum을 참조하는 외래키로 지정 -- (제약조건이름 r_fk2) );
해당 블록 선택 후 Alt+x하면 table 생성됨
테이블 수정(ALTER)
1. 필드명 변경
ALTER TABLE 테이블이름 RENAME COLUMN 변경전이름 TO 변경후이름
-- booklist 테이블의 subject 필드명을 title로 수정 alter table booklist rename column subject to title; -- 반대로 title 필드명을 subject 필드명으로 수정함 alter table booklist rename column title to subject; -- memberlist 테이블의 membername 필드를 name으로 변경 alter table memberlist rename column membername to name -- rentlist 테이블의 rent_date 필드를 rentdate로 변경 alter table rentlist rename column rent_date to rentdate -- rentlist의 idx를 num으로 변경 alter table rentlist rename column idx to num -- booklist의 booknum을 num으로 변경 alter table booklist rename column booknum to num -- memberlist의 membernum을 num으로 변경 alter table memberlist rename column membernum to num
*바뀐 내용을 확인하고 싶으면 select를 이용함
select*from booklist; select*from memberlist; select*from rentlist;
booknum 필드가 num으로 변경된 것을 확인할 수 있 membername → name membernum → num 2. 필드 자료형 변경
ALTER TABLE 테이블명 MODIFY 필드명 자료형
-외래키와 상관없는 자료형 변경
-- varchar2(12)였던 memberlist 테이블의 name 필드를 -- varchar2(30)으로 변경 alter table memberlist modify name varchar2(30); -- 수정 성공
-외래키로 연결되어 있는 필드의 자료형 변경
-- booklist의 num(varchar2(5))필드를 number(5)로 자료형 변경 alter table boolist modify num number(5); -- 수정 실패 -- rentlist의 bNum(varchar2(5))필드를 number(5)로 자료형 변경 alter table rentlist modify bnum number(5); -- 수정 실패 -- 참조되거나 참조하는 컬럼(필드)의 자료형이 -- 현재 수정하려는 컬럼(필드) 자료형과 호환되지 않음
-외래키는 참조하는 필드의 자료형과, 참조되는 필드의 자료형이 일치해야 생성도 되고 유지도 됨
-외래키로 연결되어서 참조되고 참조하고 있는 필드들은 위의 명령으로 수정이 바로 불가능함
-가능하게 하려면 외래키 제약 조건을 수정하여 없애버리고 참조되는 필드와 참조하는 필드를 모두 수정한 후 외래키 제약 조건을 다시 설정함
3. 필드 추가
ALTER TABLE 테이블명 ADD 필드명 자료형
-- booklist에 구매등급을 저장할 수 있는 -- grade 필드를 varchar2(15)로 추가 alter table booklist add grade varchar2(15); -- memeberlist에 성별(gender)필드를 varchar2(3)으로 추가 alter table memberlist add gender varchar2(3); -- memberlist에 나이(age)필드를 number(3)로 추가 alter table memberlist add age number(3);
4. 필드 삭제
ALTER TABLE 테이블명 DROP COLUMN 필드명
5. 제약조건 추가/제거
ALTER TABLE 테이블명 MODIFY 필드명 자료형
ALTER TABLE 테이블명 DROP/ADD CONSTRAINT 제약조건명
-- 필드레벨로 지정되어 있는 제약조건은 modify로 수정(추가, 삭제)함 -- booklist의 num varchar2(5) 수정 alter table booklist modify num number(5); -- memberlist의 num varchar2(5) 수정 alter table memberlist modify num number(5); -- rentlist의 bNum varchar2(5) 수정 alter table rentlist modify bNum number(5); -- rentlist의 mNum varchar2(5) 수정 alter table rentlist modify mNum number(5); -- 테이블레벨로 지정되어 있는 제약조건은 -- alter table 테이블명 drop(or add) constraint 제약조건명으로 -- 수정/추가함. -- 이때 제약조건의 이름이 사용됨 -- rentlist 테이블의 bnum에 걸려 있는 외래키 제약조건 제거 alter table rentlist drop constraint r_fk1; -- rentlist 테이블의 mnum에 걸려 있는 외래키 제약조건 제거 alter table rentlist drop constraint r_fk2; -- rentlist 테이블의 기본키 제거 alter table rentlist drop constraint r_pk; -- 위에 삭제되었던 r_fk1, r_fk2, r_pk 제약조건은 다시 설정. -- r_pk는 num 필드 하나로만 설정함 alter table rentlist add constraint r_fk1 foreign key(bNum) references booklist(num); alter table rentlist add constraint r_fk2 foreign key(mNum) references memberlist(num); alter table rentlist add constraint r_pk primary key(num); -- memberlist 테이블의 성별(gender) 필드에 -- 'F', 'M' 두글자만 입력되도록 제약조건을 추가 alter table memberlist add constraint check_gender check(gender in('F','M')); -- in()함수: 괄호 안의 항목 중 하나에 해당하면 true가 리턴되는 함수. -- 위의 내용은 check 함수에 의해 gender 필드의 돌아갈 값이 -- in() 함수 안의 항목 중 하나와 같다면 입력 허용, -- 아니면 불허하는 제약조건임 -- memberlist 테이블의 나이(age) 필드에 -- 120살이 초과되는 나이는 입력되지 못하게 제약 조건 추가 alter table memberlist add constraint chk_age check(age<120);
EX
-- 테이블 생성 연습 문제 -- 테이블명: ORDERS1 -- 필드: -- order_id number(12,0), order_date date, -- order_mode varchar2(8), custobe_id number(6,0), -- order_status number(2,0),order_total number(8,2), -- sales_rep_id number(6,0), promotion_id number(6,0) -- 제약사항 -- 1. order_id: 기본키 -- 2. order_mode에는 'direct', 'online'만 입력가능한 테이블레벨 생성 -- 3. order_total: 디폴트 값 0 create table orders1( order_id number(12,0) , order_date date, order_mode varchar2(8), customer_id number(6,0), order_status number(2,0), order_total number(8,2) default 0, sales_rep_id number(6,0), promotion_id number(6,0), constraint pk_order primary key(order_id), constraint ck_order_mode check(order_mode in('direct','online')) ); -- 테이블 수정 연습문제 -- customer_id 필드명을 customer_number로 수정 alter table orders1 rename column customer_id to customer_number; -- promotion_id 값은 10000~99999 사이의 값만 저장 가능 -- 작성 tip: promotion_id between 10000 and 99999 alter table orders1 add constraint pro_check check(promotion_id between 10000 and 99999); -- 테이블의 복사 create table orders2 as select*from orders1; -- 테이블의 제거 drop table orders2 purge; --purge는 생략 가능 -- purge가 없이 삭제된 테이블은 나중에 휴지통과 같이 복구가 가능 -- purge를 사용하면 완전 삭제 -- purge를 쓰지 않고 삭제한 테이블의 복구 -- 양식: flashback table 테이블명 to before drop; -- 삭제된 정보들의 조회 select*from recyclebin;
VIEW
-물리적인 테이블에 근거한 논리적인 가상 테이블
-가상이란 단어는 실질적으로 데이터를 저장하고 있지 않기 때문에 붙인 것이고, 테이블이란 단어는 실질적으로 데이터를 저장하고 있지 않더라도 사용 계정자는 마치 테이블을 사용하는 것과 동일하게 뷰를 사용할 수 있기 때문에 붙인 것
-뷰는 기본테이블에서 파생된 객체로서 기본테이블에 대한 하나의 쿼리문
-실제 테이블에 저장된 데이터를 뷰를 통해서 볼 수 있도록 함
-사용자에게 주어진 뷰를 통해서 기본 테이블을 제한적으로 사용할 수 있음
-뷰는 이미 존재하고 있는 테이블에 제한적으로 접근하도록함
-뷰를 생성하기 위해서는 실질적으로 데이터를 저장하고 있는 물리적인 테이블이 존재해야 되는데 이 테이블은 기본테이블이라고 함. 두개 이상의 테이블 또는 한 개의 테이블이나 또 다른 뷰를 참조하는 객체
-저장된 테이블이라기 보다 공식 또는 select 문을 갖고 있다가 명령대로 불러와 그때 그때 구성하는 형식
-원본의 데이터 변화가 실시간으로 반영됨
creat or replace view 뷰이름 as(select구문) --select 명령: 실제 테이블의 부분집합 -- (행 일부 또는 전부, 열 일부 또는 전부)
SEQUENCE
-테이블 내의 유일한 숫자를 자동으로 생성하는 자동 번호 발생기
-테이블 생성 후 시쿼스(일련번호)를 따로 만들어야 함
-주로 number 형식에 기본키값으로 사용함
-일련번호정도로 이해해도 무방함
-number(자리수): 자료형의 자리수가 몇자리냐에 따라 그만큼 숫자가 증가할 수 있음
1. 시퀀스 생성
create sequence 시퀀스이름 start with 시작숫자 increment by 증가량;
create sequence member_seq start with 1 increment by 1; insert into memberlist (num, name, phone) values(member_seq.nextVal, '홍길동', '010-2222-3333'); insert into memberlist (num, name, phone) values(member_seq.nextVal, '홍길남', '010-5555-6666'); insert into memberlist (num, name, phone) values(member_seq.nextVal, '홍길서', '010-7777-8888');
2. 현재 시퀀스가 어디까지 증가되어져 있는지 확인
select member_seq.currval, member_seq.nextVal from dual;
3. 시퀀스 수정: 최대 증가값을 14까지로 제한
alter sequence member_seq maxvalue 14;
4. 시퀀스 삭제
-지나간 숫자를 꼭 쓰고 싶다면 시퀀스를 삭제하고 새로 만들 때 그 번호부터 시작해야함
drop sequence member_seq;
연습해보기
-- 1부터 1씩 늘어나는 book_seq, rent_seq를 생성해줌 create sequence book_seq start with 1 increment by 1; create sequence rent_seq start with 1 increment by 1; -- member_seq 를 삭제했다가 4부터 늘어나도록 다시 생성해줌 drop sequence member_seq; create sequence member_seq start with 4 increment by 1;
'DataBase > Oracle' 카테고리의 다른 글
[Oracle] join, view, subquery (0) 2022.09.09 [Oracle] 문자열함수, 수식처리, 날짜처리, 그룹함수 (0) 2022.09.09 [Oracle] DML (0) 2022.09.09 [Oracle] DB(database), SQL, 오라클자료형 (0) 2022.09.09 [Oracle] 설치 (0) 2022.09.09