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
로 설정된 열은 중복 값과 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씩 증가합니다. 별도로 값을 지정하지 않아도 데이터베이스가 자동으로 값을 할당합니다.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
제약조건의 지원이 제한될 수 있습니다(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)
제약조건을 설정하여, pcode
와 ccode
열의 조합이 고유하도록 합니다. 즉, 같은 pcode
와 ccode
의 조합이 테이블에 중복으로 입력될 수 없습니다. 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'); -- 에러 발생
pcode
와 ccode
의 조합이 모두 서로 다르므로 삽입이 성공적으로 이루어집니다. pcode = 1000
과 ccode = 1000
의 조합은 이미 첫 번째 삽입된 데이터에서 존재하므로, 이와 동일한 조합을 다시 삽입하려고 하면 중복된 값 에러가 발생합니다.UNIQUE (pcode, ccode)
제약조건이 설정되어 있기 때문에 중복 삽입이 제한됩니다.