Peony의 기록 창고 🌼
반응형

제약조건이란 ?

테이블 열에 저장될 데이터의 특성, 조건을 지정하는 최소한의 장치

 

종류 설명
NOT NULL 지정한 열에 NULL을 허용하지 않는다. NULL을 제외한 데이터의 중복은 허용된다.
UNIQUE 지정한 열이 유일한 값을 가져야 한다. 즉, 중복될 수 없다. 단, NULL은 값의 중복에서 제외된다.
PRIMARY KEY 지정한 열이 유일한 값이면서 NULL을 허용하지 않는다. PRIMARY KEY는 테이블에 하나만 지정 가능하다.
FOREIGN KEY 다른 테이블의 열을 참조하여 존재하는 값만 입력할 수 있다.
CHECK 설정한 조건식을 만족하는 데이터만 입력 가능하다.

 

제약 조건 지정 방법

  1. 테이블을 생성하며 제약 조건 지정하기
  2. 테이블을 생성하며 제약 조건 이름 직접 지정하기

 

 

데이터 무결성이란?

데이터베이스에 저장되는 데이터의 정확성과 일관성을 보장한다

 

무결성 종류

종류 설명
영역 무결성(domain integrity) 열에 저장되는 값의 적정 여부를 확인. 자료형, 적절한 형식의 데이터, NULL의 여부 같은 정해 놓은 범위를 만족하는 데이터임을 규정
개체 무결성(entity integrity) 테이블 데이터를 유일하게 식별할 수 있는 기본키는 반드시 값을 가지고 있어야 하며 NULL이 될 수 없고 중복될 수도 없음을 규정
참조 무결성(referential integrity) 참조 테이블의 외래키 값은 참조 테이블의 기본키로서 존재해야 하며 NULL이 가능

 

 

제약 조건 확인하기

USER_CONSTRAINTS

열 이름 설명
OWNER 제약 조건 소유 계정
CONSTRAINT_NAME 제약 조건 이름(직접 지정하지 않을 경우 오라클이 자동으로 지정함
CONSTRAINT_TYPE 제약 조건 종류C: CHECK, NOT NULLU: UNIQUEP: PRIMARY KEYR: FOREIGN KEY
TABLE_NAME 제약 조건을 지정한 테이블 이름

 

 

NOT NULL

데이터의 중복 여부와는 상관없이 NULL의 저장을 허용하지 않는 제약 조건

제약조건을 설정하였으나, 이름을 지정하지 않으면 오라클에서 자동으로 이름을 지정해준다.

CONSTRAINT 키워드를 사용해서 이름을 지정할 수 있다. 여기서는 테이블명_컬럼명_제약조건 순으로 이름을 정했다.

SQL> alter table emp2
modify ename verchar2(10) not null;  

SQL> desc emp2

SQL> select table_name, constraint_name, constraint_type from user_constraints
where table_name = 'EMP2'; 

---

SQL> alter table emp2
SQL> modify ename varchar2(10) constraint emp2_ename_nn not null;

SQL> set linesize 200
select table_name, constraint_name, constraint_type from user constraints 
where table_name = 'EMP2';

update emp
set ename = null
where empno = 7788;
// ename column은 not null 제약 때문에 오류

 

 

UNIQUE

중복 허용 X

null은 데이터가 존재하지 않음을 의미하므로 중복 대상에서는 제외된다. → null은 여러개 저장 가능하다.

SQL> alter table dept2
add constraint dept_dname_uq unique (dname);

SQL> set linesize 200
select table_name, constraint_name, constraint_type 
from user constraints 
where table_name = 'DEPT2';

SQL> select * from dept2;          

SQL> insert into dept2             
values (50, 'SALES', 'DALLAS');
//중복 값이 들어가므로 오류 

 

 

PRIMARY KEY

null 허용 X, 중복 허용 X

테이블에 하나만 지정할 수 있다.

PRIMARY KEY로 지정하면 자동으로 인덱스가 만들어 진다.

SQL> alter table emp2
add constraint emp2_empno_pk primary key (empno);

SQL> select table_name, constraint_name, constraint_type 
from user_constraints
where table_name IN ('EMP2', 'DEPT2');

SQL> select empno, ename, job
from emp2
where job = 'ANALYST';

SQL> update emp2
set empno = 7788
where ename = 'FORD';

 

 

FOREIGN KEY

다른 테이블의 PRIMARY KEY를 참조

자식쪽에서 FOREINGN KEY 설정해준다.

참조하고 있는 키의 데이터와 NULL만 저장 가능하다.

 

FOREIGN KEY로 참조 행 데이터 삭제하기

  • ON DELETE CASCADE
  • ON DELETE SET NULL

 

SQL> alter table dept2
add constraint dept2_deptno_pk primary key (deptno);

SQL> alter table emp2
add constraint emp2_deptno_fk foreign key (deptno) references dept2 (deptno); 

SQL> select table_name, constraint_name, constraint_type 
from user_constraints
where table_name IN ('EMP2', 'DEPT2');    

---

SQL> delete from dept2
where deptno = 20;

SQL> update dept2
set deptno = 25
where deptno = 20;

SQL> select enamen, deptno
from emp2
where ename = 'SMITH';

SQL> update emp2
set deptno = 80
where ename = 'SMITH';

SQL> update emp2  
set deptno = NULL
where ename = 'SMITH';
//확인하기

SQL> delete from dept2
  2  where deptno = 20;

delete from dept2
*
ERROR at line 1:
ORA-02292: integrity constraint (SCOTT.EMP2_DEPTNO_FK) violated - child record found

SQL> update dept2
  2  set deptno = 25
  3  where deptno = 20;

update dept2
*
ERROR at line 1:
ORA-02292: integrity constraint (SCOTT.EMP2_DEPTNO_FK) violated - child record found

SQL> update emp2
  2  set deptno = 80
  3  where ename = 'SMITH';

update emp2
*
ERROR at line 1:
ORA-02291: integrity constraint (SCOTT.EMP2_DEPTNO_FK) violated - parent key not found

SQL> update emp2
  2  set deptno = NULL
  3  where ename = 'SMITH';

1 row updated.

 

 

CHECK

열에 저장할 수 있는 값의 범위 또는 패턴을 정의할 때 사용

SQL> alter table emp2
add constraint emp2_job_ck check (job in ('ANALYST','CLERK', 'MANAGER', 'PRESIDENT', 'SALESMAN'));

select table_name, constraint_name, constraint_type   //제약조건이 잘 적용되었는지 확인
from user_constraints
where table_name IN ('EMP2', 'DEPT2');  

SQL> update emp2
set job = '개발'
where ename = 'SMITH'

SQL> update emp2
set job = 'clerk'  
where ename = 'SMITH';

 

 

Default

열에 저장할 값이 지정되지 않았을 경우 기본값(default)을 지정

SQL> alter table emp2
modify hiredate date default sysdate;

SQL> insert into emp2 (empno, ename, job, sal, deptno)
values(9999, 'PEONY', 'CLERK', 777, 40);

select ename, job, to_char(hiredate, 'YYYY-MM-DD HH24:MI:SS') hiredate
  2  from emp2
  3  where ename = 'PEONY';

ENAME                JOB                HIREDATE
-------------------- ------------------ --------------------------------------
PEONY                CLERK              2024-07-12 14:17:30

SQL>  update emp2
  2  set hiredate = 'default'
  3  where ename = 'SMITH';

set hiredate = 'default'
               *
ERROR at line 2:
ORA-01841: (full) year must be between -4713 and +9999, and not be 0

SQL> select ename, job, to_char(hiredate, 'YYYY-MM-DD HH24:MI:SS') hiredate
  2  from emp2
  3  where ename = 'SMITH';

ENAME                JOB                HIREDATE
-------------------- ------------------ --------------------------------------
SMITH                CLERK              1980-12-17 00:00:00

 

 

 

테이블 생성할 때 제약 조건 넣기

SQL> drop table emp2;  
SQL> drop table dept2;

SQL> create table dept2 ( 
      deptno number(2)      constraint dept2_deptno_pk primary key
,     dname  varchar2(14)   constraint dept2_dname_uq unique
,     loc    varchar2(13)   constraint dept2_loc_nn not null
);

 

다른 방식

create table dept2 ( 
      deptno number(2)
,     dname  varchar2(14)
,     loc    varchar2(13)   
,     constraint dept2_deptno_pk primary key
,     constraint dept2_dname_uq unique
,     constraint dept2_loc_nn not null
); 

create table emp2(
    empno     number(4)       constraint emp2_empno_pk primary key
,   ename     varchar2(10)    constraint emp2_ename_nn not null
,   job       varchar2(9)     constraint emp2_job_ck check (job in ('ANALYST','CLERK', 'MANAGER', 'PRESIDENT', 'SALESMAN'))
,   mgr       number(4)       constraint emp2_mgr_fk references emp2 (empno) 
,   hiredate  date            default sysdate
,   sal       number(7, 2)    constraint emp2_sal_ck check (sal between 700 and 9999)
,   comm      number(7, 2)       
,   deptno    number(2)       constraint emp2_deptno_fk references dept2 (deptno)
);
SQL> set linesize 50
desc emp

Name                     Null?    Type
 ----------------------- -------- ----------------
 EMPNO                   NOT NULL NUMBER(4)
 ENAME                            VARCHAR2(10)
 JOB                              VARCHAR2(9)
 MGR                              NUMBER(4)
 HIREDATE                         DATE
 SAL                              NUMBER(7,2)
 COMM                             NUMBER(7,2)
 DEPTNO                           NUMBER(2)

// 테이블 정의서
 EMPNO            NUMBER(4)        PK
 ENAME            VARCHAR2(10)     NN
 JOB              VARCHAR2(9)      CK (ANA.., CLE.., MAN.., PRE.., SAL..)
 MGR              NUMBER(4)        FK (EMP2.EMPNO))
 HIREDATE         DATE             DK (sysdate)
 SAL              NUMBER(7,2)      CK (700~9999)
 COMM             NUMBER(7,2)
 DEPTNO           NUMBER(2)        FK (DEPT2.DEPTNO)

 

 

 

복합 column에 제약 조건을 설정하기

create table memder (
        id         varchar2(15)   constraint member_id_pk primary key
,       password   varchar2(15)   constraint member_password_nn not null
,       name       varchar2(15)   constraint member_name_nn not null
,       phone      varchar2(11)   constraint member_phone_nn not null
,       jumin1     number(6)      constraint member_jumin1_nn not null    // 주민번호 앞자리
,       jumin2     number(7)      constraint member_jumin2_nn not null    // 주민번호 뒷자리
,       constraint member_phone_uq unique (phone)
,       constraint member_jumin12_uq unique (jumin1, jumin2)              // 주민번호 전체로 하나의 제약조건을 설정함
);

 

반응형
profile

Peony의 기록 창고 🌼

@myeongju