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 대절님

댓글을 달아 주세요



티스토리 툴바