본문 바로가기

Learning/SQL

제약조건 (constraints)

<제약조건 (constraints)>

 

  • 제약조건: 테이블 단위에서 데이터의 무결성을 보장해주는 규칙. 테이블에 데이터가 입력, 수정, 삭제되거나 테이블이 삭제, 변경될 경우 잘못된 트랜잭션이 수행되지 않도록 결함을 유발할 가능성이 있는 작업을 방지하는 역할을 담당.

 

  • 무결성: 정보가 원 그대로 변형되지 않고 전달되는 성질. 원래의 정보 또는 신호가 전송/저장/변환 중에 또는 그 후에도 동일함을 유지하는 것

 

  • 오라클에서 제공되는 제약조건

    • NOT NULL: 열이 NULL값을 포함할 수 없음

    • UNIQUE KEY (UK)-고유키: 테이블의 모든 행에서 고유한 값을 갖는 열 또는 열조합을 지정

    • PRIMARY KEY (PK)-기본키: 해당 열은 반드시 존재하고 유일해야 함. NOT NULL, UK제약 조건 결합한 형태

    • FOREIGN KEY (FK)-외래키: 한 열과 참조된 테이블 열 간의 외래 키 관계를 설정

    • CHECK: 해당 열에 저장 가능한 데이터 값의 범위나 조건 지정

 

  • 제약조건 문법

1
2
3
4
5
6
CREATE TABLE 테이블이름(
컬럼 데이터타입 [DEFAULT default값] [컬럼 레벨 제약조건], 
--위치가 열 옆
...
[테이블 레벨 제약조건], --혹은 위치가 아래쪽에
...
);
cs

 


 

  • 제약조건을 걸고 emp 테이블 만들기 (열 이름 옆에)

1
2
3
4
CREATE TABLE emp (
    eno     NUMBER(3CONSTRAINT emp_eno_pk PRIMARY KEY,
    emp_name VARCHAR2(20)
);
cs

 

 

 


1
DESC emp;
cs

 

emp 테이블 Describe하기: eno는 NOT NULL이므로 반드시 값을 입력해야함

 

 


emp 테이블에 데이터 입력하기

1
2
3
4
5
6
INSERT INTO emp
VALUES (1'김');
INSERT INTO emp
VALUES (2'박');
INSERT INTO emp
VALUES (2'양');
cs

 

eno는 기본키이기 때문에 중복값이 발생하면 안됨

 

 

emp 테이블의 모든 데이터 출력

1
SELECT * FROM emp;
cs

 

 


emp 테이블 삭제하기

1
DROP TABLE emp;
cs

 


 

 

  • 제약조건을 걸고 emp 테이블 만들기 (열의 데이터 타입을 정한 뒤)

1
2
3
4
5
6
CREATE TABLE emp (
    eno     NUMBER(3),
    emp_name VARCHAR2(20),
    CONSTRAINT emp_eno_pk PRIMARY KEY (eno)
--어떤 열의 제약조건인지 괄호 안에 적어줌
);
cs

 

 

 


 

  • 제약조건의 이름이 없는 경우

1
2
3
4
5
6
7
8
9
10
CREATE TABLE emp1 (
    eno     NUMBER(3) PRIMARY KEY,
    emp_name VARCHAR2(20)
);
 
INSERT INTO emp1
VALUES (1,'김');
INSERT INTO emp1
VALUES (1,'박');
--컴퓨터에서 자동으로 제약조건을 만들어줌
cs

 

제약조건의 이름이 없지만 PRIMARY KEY 명령어에 의해 eno 컬럼은 기본키가 되고, 중복값이 오거나 NULL 값이면 안되기 때문에 오류가 발생

 

 


  • NOT NULL / UK 유니크

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DROP TABLE emp1;
 
CREATE TABLE emp1 (
    eno         NUMBER(3),
    emp_name    VARCHAR2(20)
    CONSTRAINT emp1_ename_nn NOT NULL,
    email       VARCHAR2(30)
    CONSTRAINT empl_email_uk UNIQUE
);
 
INSERT INTO emp1
VALUES (1NULL'hong@naver.com');
--emp_name은 NOT NULL이기 때문에 NULL값을 넣을 수 없음
 
cs

 

 

 

 

  • UK 유니크는 동일한 값이 입력될 수 없음

1
2
3
4
INSERT INTO emp1
VALUES (1'홍길동''hong@naver.com');
INSERT INTO emp1
VALUES (2'김유신''hong@naver.com');
cs

 

 

 


 

  • CHECK 제약조건

1
2
3
4
5
6
7
8
9
10
CREATE TABLE emp2 (
    eno         NUMBER (3),
    emp_name    VARCHAR2(20)
    CONSTRAINT emp2_ename_nn NOT NULL,
    sal      VARCHAR2(10)
    CONSTRAINT emp2_sal_check CHECK (sal > 1000)
);
 
INSERT INTO emp2
VALUES(1'홍길동'999);
cs

 

 


 

  • emp 테이블 삭제 후 다시 emp 테이블을 만들고 제약조건을 걸기

1
2
3
4
5
6
7
8
9
10
11
12
DROP TABLE emp;
CREATE TABLE emp (
    eno NUMBER (4PRIMARY KEY
--제약조건 이름 생략
    ename VARCHAR2(20NOT NULL
--데이터가 NULL이면 안됨
    gno VARCHAR2(13UNIQUE CHECK (LENGTH(gno)>=8), 
--8자리 이상 되어야 함
    gender VARCHAR2(5) CHECK (gender IN ('woman''man')) 
--woman혹은 man중 하나의 값이어야함
);
 
cs

 

 

emp 테이블에 데이터 입력하기

1
2
3
INSERT INTO emp VALUES (1'김''12345678''man');
INSERT INTO emp VALUES (2'강''123456789''woman');
INSERT INTO emp VALUES (3'강''1234567''woman');
cs

 

UNIQUE CHECK(LENGTH(gno)>=8) 이란 제약조건에 의해 7자리 gno 데이터는 들어갈 수 없음

 

 

gender 값은 man혹은 woman 둘 중 하나여야 하기 때문에 오류 발생

1
INSERT INTO emp VALUES (4'양''123456789''human');
cs

 

 

 


 

<제약조건 예제>

 

  • members라는 새 테이블을 만들기 (제약조건 이름은 생략가능)

1
2
3
4
5
6
7
8
9
CREATE TABLE members (
    member_id    NUMBER (2)     PRIMARY KEY,
    first_name   VARCHAR2 (50)  NOT NULL,
    last_name    VARCHAR2 (50)  NOT NULL,
    gender       VARCHAR2 (5)   CHECK (gender IN('Man','Woman')),
    birth_day    DATE           DEFAULT sysdate,
    email        VARCHAR2 (200UNIQUE NOT NULL
);
DESC members;
cs

 

 

 


 

  • 외래키 (FK) 관련 제약조건

  • dept 부서테이블을 생성 (기본키만 가지고 있음)

1
2
3
4
5
6
CREATE TABLE dept (
    dno     NUMBER (4),
    dname   VARCHAR2 (20),
    CONSTRAINT dept_dno_pk PRIMARY KEY(dno) --기본키
);
DROP TABLE emp;
cs

 


 

  • dept 테이블을 참조하는 emp 테이블 생성하고 dept 테이블의 dno를 참조

1
2
3
4
5
6
7
8
9
CREATE TABLE emp (
    eno         NUMBER (4),
    emp_name    VARCHAR2 (20),
    sal         NUMBER (10),
    dno         NUMBER (4),
    CONSTRAINT emp_eno_pk PRIMARY KEY(eno),
    CONSTRAINT emp_dno_fk FOREIGN KEY(dno)
        REFERENCES dept(dno)
);
cs

 


 

 

  • dept 테이블에 데이터 입력

1
2
3
4
5
6
INSERT INTO dept VALUES (10'TEST1');
INSERT INTO dept VALUES (20'TEST2');
INSERT INTO dept VALUES (30'TEST3');
INSERT INTO dept VALUES (40'TEST4');
INSERT INTO dept VALUES (50'TEST5');
SELECT * FROM dept;
cs

 


 

 

  • emp 테이블에 데이터 입력

1
2
3
4
5
6
INSERT INTO emp VALUES (1010'Kim'20010);
INSERT INTO emp VALUES (1020'Lee'18020);
INSERT INTO emp VALUES (1030'Jung'22030);
INSERT INTO emp VALUES (1040'Oh'25040);
INSERT INTO emp VALUES (1050'King'30050);
SELECT * FROM emp;
cs

 

 

  • emp에서 참조하고 있는 dept 테이블의 dno은 현재 dno가 10, 20, 30, 40, 50. 60이 없기에 입력 불가능

1
2
--외래키는 참조열의 값 이외에는 입력불가
INSERT INTO emp VALUES (1060'Kang'50060);
cs

 

 

 

1
INSERT INTO emp VALUES (1060'Kang'500NULL);
cs

 

 

 

  • emp 테이블이 참조하고 있기 때문에 삭제시 에러발생

1
2
DELETE FROM dept
WHERE dno=20;
cs

 

 

 


 

  • ON DELETE CASCADE: 삭제 시 참조하는 열 값도 삭제

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DROP TABLE emp; 
 
CREATE TABLE emp (
    eno         NUMBER (4),
    emp_name    VARCHAR2 (20),
    sal         NUMBER (10),
    dno         NUMBER (4),
    CONSTRAINT emp_eno_pk PRIMARY KEY(eno),
    CONSTRAINT emp_dno_fk FOREIGN KEY(dno)
        REFERENCES dept(dno) ON DELETE CASCADE
);
 
INSERT INTO emp VALUES (1010'Kim'20010);
INSERT INTO emp VALUES (1020'Lee'18020);
INSERT INTO emp VALUES (1030'Jung'22030);
INSERT INTO emp VALUES (1040'Oh'25040);
INSERT INTO emp VALUES (1050'King'30050);
 
DELETE FROM dept
WHERE dno=20;
cs

 

 

 

 


 

 

  • ON DELETE SET NULL: 참조행 삭제시 자동 널값

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
DROP TABLE emp; 
 
CREATE TABLE emp (
    eno         NUMBER (4),
    emp_name    VARCHAR2 (20),
    sal         NUMBER (10),
    dno         NUMBER (4),
    CONSTRAINT emp_eno_pk PRIMARY KEY(eno),
    CONSTRAINT emp_dno_fk FOREIGN KEY(dno)
        REFERENCES dept(dno) ON DELETE SET NULL
);
 
INSERT INTO emp VALUES (1010'Kim'20010);
INSERT INTO emp VALUES (1020'Lee'18020);
INSERT INTO emp VALUES (1030'Jung'22030);
INSERT INTO emp VALUES (1040'Oh'25040);
INSERT INTO emp VALUES (1050'King'30050);
 
DELETE FROM dept
WHERE dno=30;
cs

 

 

 

'Learning > SQL' 카테고리의 다른 글

제약조건의 삭제  (0) 2020.06.22
제약조건의 추가 및 수정  (0) 2020.06.22
테이블 만들고 삭제하기  (0) 2020.06.19
오라클 SQL의 데이터타입  (0) 2020.06.19
데이터 조작어(DML) - DELETE (데이터의 삭제)  (0) 2020.06.19