Oracle 6강

programing/Oracle 2009.04.13 21:32


*무결성 제약조건
DB에 결점이 없어야함
ex)

empno : 고유번호(PK)
ename : null값 X(not null)
sal : 최저임금 ~ 최대임금(check)
deptno : 회사가 정한 고유값 중복가능(FK)
dname : 고유(unique)
 
Constraint : 제약조건을 걸어 DB가 조건을 만족해야함
primary key
Not null
Check
Unique
Foreign key

*
>create table dept1
(deptno    number(2) primary key, <- column level 정의방식
dname      varchar2(20) unique,
loc        varchar2(20));

>create table emp1
(empno     number(4) constraint emp1_empno_pk primary key,
ename      varchar2(20) not null,
sal        number(7,2),
deptno     number(2),
constraint emp1_sal_ck check (sal between 500 and 5000),
constraint emp1_deptno_fk foreign key (deptno)
   references dept1(deptno));

1) column level 정의 방식  [생략가능]
 컬럼명 datatype [ constraint 제약명 ] 제약종류
ex) deptno number(2) primary key
-제약명은 생략가능 하며, 생략시 제약의 이름은 오라클이 임의지정합니다.
SYS_C숫자형으로 자동 지정.
2) table level 정의방식
 컬럼명 datatype,
 컬럼명 datatype,
 컬럼명 datatype,
 constraint 제약명 제약종류(컬럼명)

>insert into dept1
values(1, 'a','b');  

>insert into dept1
values(1, 'b','c');  <--ERROR 무결성제약조건 위배
    deptno <-가 PK, 동일한 번호 insert
>desc user_constraints  <--제약조건보기

--선택한 컬럼의 제약조건을 확인
>select constraint_name, constraint_type, table_name,
search_condition
from user_constraints
where table_name in('EMP1','DEPT1');  <--''문자열 대소문자 구분
pk중복위반이란것을 일수있음.
--constraint_type : p(primary key), U(unique), C(check),R(foreign key)
--NOT NULL 제약은 check의 일종(search_condition 에서 is not null 확인)

>insert into emp1  
values(1111,'이순신',3000,2); <--ERROR 부모키 없다고나옴
       deptno는 dept1테이블의(deptno)참조

>insert into emp1
values(1111,'이순신',3000,1); <--부모키가 있으므로 ERROR X

>delete dept1
where deptno = 1;  <--부모키인 dept1테이블의 deptno = 1을
       지울경우 emp1테이블의 deptno에서 참조하고있기 때문에
       ERROR 삭제 X

--unique는 NULL을 제외한 값이 고유해야함. null값은 중복사용가능
ex) loc 컬럼에 제약을 추가하고싶을경우
>ALTER TABLE dept1      ┌바꾸려는 컬럼명 
add constraint dept1_loc_uk unique(loc);
  ALTER TABLE 테이블명
  ADD 테이블레벨 정의방식
ex) loc컬럼 제약 제거하기
>alter table dept1
drop constraint dept1_loc_uk;
ex) loc컬럼에 NOT NULL 제약을 줄경우 (NOT NULL의 경우 방식이 다름)
>alter table dept1
add constraint dept1_loc_nn not null (loc);    <-- ERROR 열명이 부족
-NOT NULL 은 CHECK의 특수한일종
-컬럼 LEVEL 정의방식
>alter table dept1
modify (loc varchar2(20) not null);  <-- 컬럼 data type변경 해야 성공

--------------------------------------------------------------------------
*Sequence = > 자동번호 발생기
>create sequence dept_deptno  <--sequence 만들기
   start with 1    <-- 시작값 1부터
   increment by 1   <-- 1씩 증가
   minvalue 1    <-- min값 1
   maxvalue 100    <-- max값 100
   nocache    <--
   nocycle;    <-- max값 지날경우 반복 X

>insert indo dept
values (dept_deptno.nextval, 'a','b'); <--만든 sequence를 이용 번호를 메겨줌
-deptno 1, dname a, loc b인 row 생성
한번더 할경우 deptno 2 --> 3 --> 4 씩 증가

>rollback;    

>insert into dept
values (dept_deptno.nextval, 'a','b'); <-- rollback전 마지막값 +1
---게시판의 경우 다른 유저가 글을올릴때 PK값까지 작성하는것이 아니므로 sequence사용

>desc user_sequences    

>select *
from user_sequences   <-- last_number 마지막 값

>drop sequence dept_deptno;  <-- sequence 지우기
        지우더라도 이미반환된 값은 지워지지 않음

>rollback;     <-- 롤백하더라도 DDL을 썼기때문에 auto commit

'programing > Oracle' 카테고리의 다른 글

Oracle 8강  (0) 2009.04.13
Oracle 7강  (0) 2009.04.13
Oracle 6강  (0) 2009.04.13
Oracle 5강  (0) 2009.04.13
Oracle 4강  (0) 2009.04.13
Oracle 3강  (0) 2009.04.13
Posted by 대절님

댓글을 달아 주세요