[Oracle] 오라클 #10, DDL, DML

DML

- 데이터 조작어(select, insert, update, delete)

- select(DQL : Data Query Language)


DDL

- 데이터 정의어

- 객체(DB Object)를 생성한다

- DB Object : 테이블, 뷰, 인덱스, 트리거, 프로시저, 제약사항 등...

- create, alter, drop


테이블 생성하기(=텍스트 파일 구조 만들기)

create table 테이블명

(

    컬럼 정의,

    컬럼 정의,

    컬럼명 자료형(길이) NULL표기 제약사항

);

ex)

create table tblTest

(

    num number(3),

    txt varchar2(10),

    regdate date

);


insert into tblTest(num,txt,regdate) values(3,'홍길동','2018-08-24');

insert into tblTest(num,txt,regdate) values(3,'홍길동',sysdate);



create 문 내부 순서

- > 컬럼명 자료형(길이) NULL표기 제약사항


제약사항, Constraint

- 해당 컬럼값에 대한 조건(규제) > 조건을 만족하지 못하면 데이터를 못 넣는다. > 유효성 검사

- 데이터 베이스 무결성 보장 - 무결성 제약조건


1. not null

- 반드시 값을 가져야 한다(필수값)

ex )

create table tblMemo

(

    seq number not null, --메모 번호 + 필수입력값(Required)

    name varchar2(20) null, --작성자 + 선택입력값(Optional)

    memo varchar2(1000) not null, --메모내용 + 필수입력값

    regdate date null       --작성시간 + 선택

);


insert into tblMemo(seq, name, memo, regdate) values ('3', '홍길동','오라클 너무재밌어.',sysdate);

insert into tblMemo(seq, name, memo, regdate) values ('4', null,'우와앙',null);

insert into tblMemo(seq, name, memo, regdate) values ('5', '홍길동',null,'2016-07-27');   --ORA-01400: cannot insert NULL into ("HR"."TBLMEMO"."MEMO")



2. primary key(PK,기본키)

- 테이블 내에서 모든 컬럼들 중에 대표가 되는 컬럼 > 행과 행을 구분하는 수단으로 사용.

- 테이블내에서 행을 구분하기 위한 고유 식별자

- 1개의 테이블 내에는 반드시 PK가 존재한다.

- PK는 보통 1개의 컬럼으로 구성 + 가끔씩 2개이상의 컬럼으로 PK를 구성하는 경우도 있음.

- PK는 따로 명시하지 않아도 자동으로 not null이 적용된다.

- PK는 따로 명시하지 않아도 Duplicate가 적용된다. > unique가 적용된다. = 중보값을 가질 수 없다

- PK = not null + unique

ex)

create table tblMemo

(

    seq number primary key, --테이블의 행 구분 고유 식별자 + not null + 중복 불가. 

    name varchar2(20) null, 

    memo varchar2(1000) not null, 

    regdate date null     

);



3. unique

- 해당 컬럼이 테이블 내에서 유일값이어야 한다.

- null을 가질 수 있다.

- 절대로 unique를 식별자로 사용해서는 안된다.(null이 있어서)

ex)

create table tblMemo

(

    seq number primary key, --테이블의 행 구분 고유 식별자 + not null + 중복 불가. 

    name varchar2(20) unique, 

    memo varchar2(1000) not null, 

    regdate date null     

);



4. check

- 열거형,범위비교 등의 제약(사용자 정의형)

ex)

create table tblMemo

(

    seq number primary key, 

    name varchar2(20) not null, 

    memo varchar2(1000) not null, 

    --regdate date not null,

    

    --color varchar2(30) not null, -->red, yellow, Blue

    --page number not null --1~9

    --color varchar2(30)check(color ='red' or color ='yellow'or color='blue') not null,

    

    color varchar2(30) check (color in ('red','yellow','blue')) not null,

    page number check(page between 1 and 9) not null,

    regdate date check(regdate between to_date('2018-01-01','yyyy-mm-dd') and to_date('2018-12-31','yyyy-mm-dd')) not null,

    regdate date check(to_char(regdate,'hh24') between 0 and 11) not null,

    regdate date check(to_char(regdate,'d') between 2 and 6) not null

    

    

);


insert into tblMemo(seq, name, memo, regdate,color,page) values (1,'홍길동','홍길동이쓰고있다.',sysdate,'red',3);

insert into tblMemo(seq, name, memo, regdate,color,page) values (2,'고길동','고길동이쓰고있다.',sysdate,'white',100); --ORA-02290: check constraint (HR.SYS_C007100) violated

    



5. default

- 컬럼 기본값

- 해당 컬럼값에 값을 넣지 않으면 null을 입력하는 대신 자동으로 미리 준비된 기본값을 넣는다.


create table tblMemo

(

    seq number primary key, --테이블의 행 구분 고유 식별자 + not null + 중복 불가. 

    name varchar2(20) default '익명' null, 

    memo varchar2(1000) not null, 

    regdate date not null     

);

insert into tblMemo(seq, name, memo, regdate) values ('1','하하하','낑',sysdate);

insert into tblMemo(seq, memo, regdate) values ('2','낑',sysdate);


create table tblMemo(

    seq number primary key, --메모번호(PK)

    name varchar2(30) not null,

    memo varchar2(1000) check(length(memo) >= 10) not null, --체크제약.

    regdate date default sysdate not null, --default 제약 기본값.

    color varchar2(10) unique            --유일값, 중복값 허용 안함(null은 중복가능)

);

drop table tblMemo;

select * from tblMemo;

insert into tblMemo(seq,name,memo,regdate,color)

values('1','홍길동','안녕하세요. 홍길동입니다.',sysdate ,'red');


insert into tblMemo(seq,name,memo,regdate,color)

values('2','호호호','테스트.',sysdate ,'yellow'); --체크에러 :ORA-02290: check constraint (HR.SYS_C007132) violated


insert into tblMemo(seq,name,memo,regdate,color)

values('3','홍길동','테스트테스트테스트테스',sysdate ,'yellow');


insert into tblMemo(seq,name,memo,regdate,color)

values('4','하하하','테스트테스트테스트테스',sysdate ,null); --유니크에러 : ORA-00001: unique constraint (HR.SYS_C007134) violated


insert into tblMemo(seq,name,memo,regdate,color)

values('5','하하하','테스트테스트테스트테스',null ,null); --다른 더 배워야할 것이 있다고함.



제약사항을 만드는 방법

1. 컬럼수준에서 만드는 방법(여태했던 방식)

    - 컬럼을 정의할 때 같이 제약을 추가하는 방법

    - 1:1제약(컬럼1개 : 제약1개)

    - 컬럼명 자료형 제약사항

    - 컬럼명 자료형 [constraint 제약명] 제약사항

    

2. 테이블 수준에서 만드는 방법

    - pk,fk,check,uq : 가능

    - nn(낫널),default : 불가능

     a. create

     b. alter//x



create table tblMemo(

    --seq number primary key,--컬럼수준 제약

    --seq number constraint aaa primary key 제약명이 aaa는 좀 아님

    seq number constraint tblmemo_seq_pk primary key, -- 현재테이블명_컬럼명_제약사항

                                                                          -- 제약이름 30자 넘기지 않도록 주의****

    memo varchar2(1000),

    constraint tblmemo_memo_ck check(length(memo)>10) not null

);


insert into tblMemo(seq) values(1);-- 성공.

insert into tblMemo(seq) values(1); --ORA-00001: unique constraint (HR.AAA) violated


insert into tblMemo(seq) values(1);-- 성공.

insert into tblMemo(seq) values(1); --ORA-00001: unique constraint (HR.TBLMEMO_SEQ_PK) violated


insert into tblMemo(seq,memo) values(1,'세글자'); --ORA-02290: check constraint (HR.TBLMEMO_MEMO_CK) violated



테이블 수준에서 제약사항 관리하기.

create table tblMemo(

    seq number,

    memo varchar2(1000) not null,

    color varchar2(30),

    page number(1),

    ---------------------------순수한 컬럼정의

    

    ---------------------------제약사항만을 만들때 따로 정의(테이블수준 정의)

    constraint tblMemo_seq_pk primary key(seq),

    constraint tblMemo_color_ck check (color in('black','white')),

    constraint tblMemo_page_ck check(page between 1 and 9)

    

    --가독성 관련(관련된 코드끼리 구분)

    --not null은 컬럼수준에서 밖에 정의를 못한다.(테이블 수준에서는 불가능)

    --constraint tblMemo_regdate_default  //디폴트 제약조건 --테이블수준에서는 없음

    --constraint tblMemo_seq_uq unique(seq), //유티크 제약조건 

);



댓글

Designed by JB FACTORY