[Day 12 | DB] NOT NULL, UNIQUE, PRIMARY KEY

y♡ding·2024년 10월 29일
0

데브코스 TIL

목록 보기
75/163

NOT NULL 제약조건

NOT NULL 제약조건은 특정 열이 반드시 값을 가져야 함을 의미합니다. dept_n1 테이블에서 deptno 열에 NOT NULL 제약조건이 설정되어 있습니다.

-- 샘플 테이블
create table dept_n1 (
    deptno int(2) not null,
    dname varchar(14),
    loc varchar(13)
);

-- 정상적으로 삽입
insert into dept_n1 (deptno, dname, loc) values (10, '개발부', '서울');

-- NULL 삽입 시도 (에러 발생)
insert into dept_n1 (deptno, dname, loc) values (NULL, '영업부', '부산');
ERROR 1048 (23000): Column 'deptno' cannot be null

-- + not null은 테이블 단위 제약 조건을 줄 수 없음. 

UNIQUE 제약조건

UNIQUE 제약조건은 열에 중복된 값이 입력되는 것을 방지합니다.

-- 샘플 테이블
create table dept_u1 (
    deptno int(2) unique, -- 컬럼단위 제약조건
    dname varchar(14),
    loc varchar(13)
);

create table dept_u2 (
deptno int(2),
dname varchar(14),
loc varchar(13),
constraint unique(deptno) -- 테이블단위 제약조건
);

-- 정상적으로 삽입
insert into dept_u1 (deptno, dname, loc) values (20, '인사부', '대전');

-- 중복된 값 삽입 시도 (에러 발생)
insert into dept_u1 (deptno, dname, loc) values (20, '재무부', '대구');
ERROR 1062 (23000): Duplicate entry '20' for key 'deptno'

-- null은 중복 검사를 하지 않음.
+--------+-----------+--------+
| deptno | dname     | loc    |
+--------+-----------+--------+
|     10 | 개발부    | 서울      |
|     20 | 인사부    | 대전      |
|   NULL | 생산부    | 서울      |
|   NULL | 생산부    | 서울      |
+--------+-----------+--------+

첫 번째 삽입은 성공하지만, 두 번째와 세 번째 삽입에서는 UNIQUE 제약조건 위반으로 에러가 발생합니다.

PRIMARY KEY 제약조건

  • PRIMARY KEY: 기본 키는 테이블의 각 행을 고유하게 식별하는 역할을 합니다. PRIMARY KEY로 설정된 열은 중복 값NULL 값을 허용하지 않습니다.
  • 사용 목적: 데이터를 고유하게 식별하여 효율적인 검색과 데이터 무결성을 보장하는 데 사용됩니다.
-- 샘플 테이블
create table dept_p1 (
    deptno int(2) primary key, -- 컬럼단위 제약조건
    dname varchar(14),
    loc varchar(13)
);

create table dept_p2 (
deptno int(2),
dname varchar(14),
loc varchar(13),
constraint primary key(deptno) -- 테이블단위 제약조건
);

-- 정상적으로 삽입
insert into dept_p1 (deptno, dname, loc) values (10, '개발부', '서울');

-- 중복된 PRIMARY KEY 값 삽입 시도 (에러 발생)
insert into dept_p1 (deptno, dname, loc) values (10, '영업부', '부산');
ERROR 1062 (23000): Duplicate entry '10' for key 'PRIMARY'

-- NULL 값 삽입 시도 (에러 발생)
insert into dept_p1 (deptno, dname, loc) values (NULL, '재무부', '대전');
ERROR 1048 (23000): Column 'deptno' cannot be null

AUTO_INCREMENT 제약조건

  • 자동 증가:
    • AUTO_INCREMENT가 설정된 열은 새 행이 삽입될 때마다 자동으로 값이 1씩 증가합니다. 별도로 값을 지정하지 않아도 데이터베이스가 자동으로 값을 할당합니다.
  • PRIMARY KEY와 함께 사용:
    • AUTO_INCREMENT 열은 일반적으로 PRIMARY KEY와 함께 설정하는 것이 좋습니다.
  • 초기 값 설정:
    • 기본적으로 AUTO_INCREMENT는 1부터 시작하며, 테이블 생성 시 또는 삽입 과정에서 특정 값을 설정할 수도 있습니다.
  • 값이 중복되지 않음:
    • AUTO_INCREMENT는 중복되지 않는 고유한 값을 보장하여 행을 유일하게 식별할 수 있습니다.
CREATE TABLE dept_a1 (
    deptno INT(2) PRIMARY KEY AUTO_INCREMENT,  -- PK와 함께 사용
    dname VARCHAR(14),
    loc VARCHAR(13)
);

-- 확인
MariaDB [sample]> desc dept_a1;
+--------+-------------+------+-----+---------+----------------+
| Field  | Type        | Null | Key | Default | Extra          |
+--------+-------------+------+-----+---------+----------------+
| deptno | int(2)      | NO   | PRI | NULL    | auto_increment |
| dname  | varchar(14) | YES  |     | NULL    |                |
| loc    | varchar(13) | YES  |     | NULL    |                |
+--------+-------------+------+-----+---------+----------------+


-- 데이터 삽입 예제
INSERT INTO dept_a1 (dname, loc) VALUES ('개발부', '서울');
INSERT INTO dept_a1 (dname, loc) VALUES ('영업부', '부산');
INSERT INTO dept_a1 (dname, loc) VALUES ('인사부', '대전');

SELECT * FROM dept_a1;
+--------+-----------+--------+
| deptno | dname     | loc    |
+--------+-----------+--------+
|      1 | 개발부    | 서울   |
|      2 | 영업부    | 부산   |
|      3 | 인사부    | 대전   |
+--------+-----------+--------+
  • deptno 열에 자동으로 1부터 순차적으로 증가하는 값이 할당됩니다.
  • insert into dept_a1 values (5, '개발부', '서울');와 같이 숫자를 넣으면 그 숫자가 insert됩니다.

CHECK 제약조건

  • 데이터 검증: CHECK 제약조건을 통해 특정 열의 값이 지정된 조건을 충족하는지 검증할 수 있습니다.
  • 여러 조건 사용 가능: 하나의 열에 여러 CHECK 제약조건을 설정할 수도 있고, 여러 열을 대상으로 복합 조건을 설정할 수도 있습니다.
  • 제약조건 위반 시 에러 발생: 조건을 충족하지 않는 데이터가 삽입되면 에러가 발생하여 데이터 무결성을 유지할 수 있습니다.
  • 데이터베이스에 따라 지원이 제한적: 일부 데이터베이스에서는 CHECK 제약조건의 지원이 제한될 수 있습니다(MariaDB의 경우 일부 상황에서 제한이 있을 수 있음).
-- 샘플용 테이블 제약조건
CREATE TABLE dept_c1 (
    deptno INT(2) CHECK (deptno >= 30),
    dname VARCHAR(14),
    loc VARCHAR(13)
);

-- 테이블단위 제약조건
create table dept_c2 (
deptno int(2),
dname varchar(14),
loc varchar(13),
check (deptno >= 30)
);

-- 조건을 만족하는 데이터 삽입 (성공)
INSERT INTO dept_c1 (deptno, dname, loc) VALUES (30, '개발부', '서울');

-- 조건을 만족하지 않는 데이터 삽입 (에러 발생)
INSERT INTO dept_c1 (deptno, dname, loc) VALUES (20, '영업부', '부산');
  • 제약조건: CHECK (deptno >= 30)

    • 이 조건은 deptno 열에 30 이상의 값만 허용하도록 설정합니다.
    • deptno 값이 30 미만이면 데이터베이스는 해당 데이터를 거부하고 에러를 발생시킵니다.

복합키 제약조건

복합 키(Composite Key)는 하나의 열(column)로는 고유하게 식별할 수 없는 데이터를 두 개 이상의 열을 조합하여 고유하게 식별할 수 있도록 설정하는 키입니다. 복합 키는 여러 열을 묶어서 하나의 키처럼 사용하며, 주로 관계형 데이터베이스에서 테이블의 기본 키(Primary Key)나 외래 키(Foreign Key)로 사용됩니다.

  • 고유성 보장: 단일 열로는 고유한 식별자가 될 수 없는 경우, 여러 열을 조합하여 데이터의 고유성을 보장합니다.
  • 데이터 무결성 유지: 복합 키를 사용하여 특정 데이터가 고유하게 식별되도록 함으로써 데이터의 일관성과 무결성을 유지합니다.
-- 복합키 샘플 테이블
CREATE TABLE order_u1 (
    pcode INT(4),
    ccode INT(4),
    orderdate DATE,
    etc VARCHAR(20),
    CONSTRAINT UNIQUE (pcode, ccode)
);

MariaDB [sample]> desc order_p1;
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| pcode     | int(4)      | NO   | PRI | NULL    |       |
| ccode     | int(4)      | NO   | PRI | NULL    |       |
| orderdate | date        | YES  |     | NULL    |       |
| etc       | varchar(20) | YES  |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+
  • UNIQUE (pcode, ccode) 제약조건을 설정하여, pcodeccode 열의 조합이 고유하도록 합니다. 즉, 같은 pcodeccode의 조합이 테이블에 중복으로 입력될 수 없습니다.
  • 이를 통해 같은 고객(ccode)이 동일한 제품(pcode)을 중복으로 주문할 수 없도록 제한할 수 있습니다.
INSERT INTO order_u1 VALUES (1000, 1000, NOW(), 'order1');  -- 성공
INSERT INTO order_u1 VALUES (100, 1000, NOW(), 'order2');   -- 성공
INSERT INTO order_u1 VALUES (1000, 100, NOW(), 'order3');   -- 성공
INSERT INTO order_u1 VALUES (1000, 1000, NOW(), 'order4');  -- 에러 발생
  • 첫 번째, 두 번째, 세 번째 삽입은 pcodeccode의 조합이 모두 서로 다르므로 삽입이 성공적으로 이루어집니다.
  • pcode = 1000ccode = 1000의 조합은 이미 첫 번째 삽입된 데이터에서 존재하므로, 이와 동일한 조합을 다시 삽입하려고 하면 중복된 값 에러가 발생합니다.
  • UNIQUE (pcode, ccode) 제약조건이 설정되어 있기 때문에 중복 삽입이 제한됩니다.

0개의 댓글

관련 채용 정보