제약 조건
제약조건으로는 아래 5가지가 있다.
1. PRIMARY KEY (PK)
2. FOREIGN KEY (FK)
3. UNIQUE KEY (UK)
4. NOT NULL
5. CHECK
📁 1. PRIMARY KEY (PK)
고유한 값이며 각 행의 구분점으로 사용된다.
중복이 없고 NULL 값을 허용하지 않는다.
모든 테이블은 PK를 가지는 것이 규칙이다.
무조건 테이블에 PK는 하나씩만 부여한다. (조합키는 예외)
PK의 특징을 확인하기 위해 테이블을 CREATE 한다.
CREATE TABLE TBL_PRODUCT(
PRODUCT_NUMBER NUMBER CONSTRAINT PK_PRODUCT PRIMARY KEY,
PRODUCT_NAME VARCHAR2(1000),
PRODUCT_PRICE NUMBER
);
TBL_PRODUCT 안에 정보를 추가해보며 테스트를 해보자.
📌 (1) 정상 케이스
INSERT INTO TBL_PRODUCT
VALUES(1, '로지텍 K855', 89000);
INSERT INTO TBL_PRODUCT
VALUES(2, '로지텍 G304', 55000);
INSERT INTO TBL_PRODUCT
VALUES(3, '팜레스트', NULL); -- NULL도 값이 없음을 나타내는 값이기 때문에 사용할 수 있다.
세번째 값에는 PRODUCT_PRICE 의 값으로 NULL 이 들어갔지만
NULL 또한 값이 없음을 나타내는 값이기 때문에 들어갈 수 있다. (PK는 안 됨)
📌 (2) 에러 케이스
-- [에러 케이스]=====================================================
INSERT INTO TBL_PRODUCT
VALUES(2, '팜레스트', 22000); -- PK가 중복일 경우에는 에러가 뜬다.
INSERT INTO TBL_PRODUCT
VALUES(NULL, '두루마리 휴지', 25000); -- PK 에는 NULL 을 넣을 수 없다.
-- [//에러 케이스]=====================================================
(1) 이미 PK 값으로 2가 들어갔기 때문에 중복으로 PK 값을 2로 가져가는 데이터는 들어갈 수 없다.
(2) PK는 NULL 값을 가질 수 없다.
📁 2. FOREIGN KEY (FK)
다른 테이블의 PK를 사용하며 중복이 가능하다.
보통 테이블끼리 관계를 맺을 때 사용한다.
NULL을 허용한다.
FK의 특징을 확인하기 위해 테이블을 CREATE 한다.
-- FK
CREATE TABLE TBL_SCHOOL( --부모 테이블을 먼저 만들어주는 게 편함
SCHOOL_NUMBER NUMBER,
SCHOOL_NAME VARCHAR2(500),
CONSTRAINT PK_SCHOOL PRIMARY KEY(SCHOOL_NUMBER)
);
CREATE TABLE TBL_STUDENT(
STUDENT_NUMBER NUMBER,
STUDENT_NAME VARCHAR2(500),
STUDENT_AGE NUMBER,
SCHOOL_NUMBER NUMBER,
CONSTRAINT PK_STUDENT PRIMARY KEY(STUDENT_NUMBER),
CONSTRAINT FK_STUDENT FOREIGN KEY(SCHOOL_NUMBER) -- FK 선언
REFERENCES TBL_SCHOOL(SCHOOL_NUMBER)
);
FK 선언은 아래와 같이 한다.
CONSTRAINT FK_STUDENT FOREIGN KEY(SCHOOL_NUMBER)
REFERENCES TBL_SCHOOL(SCHOOL_NUMBER)
CONSTRAINT FK_STUDENT | FK_STUDENT 라는 이름의 FOREIGN KEY 를 선언한다 |
FOREIGN KEY(SCHOOL_NUMBER) | 해당 FK는 SCHOOL_NUMBER 라는 이름으로 선언되어 있는 값이다 |
REFERENCES TBL_SCHOOL(SCHOOL_NUMBER) | FK는 TBL_SCHOOL 안의 SCHOOL_NUMBER 를 참조(REFERENCES)할 것이다 |
-- 학교 테이블에 INSERT 진행
INSERT INTO TBL_SCHOOL
VALUES (1, '로지텍 고등학교');
INSERT INTO TBL_SCHOOL
VALUES (2, '레이저 고등학교');
INSERT INTO TBL_SCHOOL
VALUES (3, 'ABKO 고등학교');
-- 학생 테이블에 INSERT 진행
INSERT INTO TBL_STUDENT
VALUES(1, '홍싸리', 22, 1);
INSERT INTO TBL_STUDENT
VALUES(2, '홍길동', 22, 1);
INSERT INTO TBL_STUDENT
VALUES(3, '김영희', 21, 2);
INSERT INTO TBL_STUDENT
VALUES(4, '박철수', 20, 4); -- FK 인 SCHOOL_NUMBER 가 존재하지 않는 값을 저장하려고 해서 에러가 남
참조하려는 SCHOOL_NUMBER 값 중에 4 값이 없기 때문에 오류가 나게 된다.
📁 3. UNIQUE KEY (UK)
NULL 은 허용하지만 중복을 허용하지 않는다.
📁 4. NOT NULL
NULL 을 허용하지 않는다.
📁 5. CHECK
특정 컬럼의 입력 가능한 값의 범위를 지정할 때 사용한다.
만약 어느 한 컬럼에 CHECK 제약 조건을 설정한다면, 그 컬럼은 특정한 범위 안에서의 값만 허용한다.
어느 한 테이블에 CHECK 제약 조건을 설정한다면, 그 레코드의 다른 컬럼을 기반으로 특정 컬럼의 값을 제한할 수도 있다.
CREATE TABLE TBL_STUDENT(
STUDENT_NUMBER NUMBER PRIMARY KEY,
STUDENT_ID VARCHAR2(500) CONSTRAINT UK_STUDENT UNIQUE, -- UNIQUE KEY는 뒤에 KEY를 붙이지 않음
STUDENT_NAME VARCHAR2(500),
STUDENT_MAJOR VARCHAR2(500),
STUDENT_GENDER CHAR(1) DEFAULT 'W' NOT NULL
CONSTRAINT CHECK_GENDER CHECK(STUDENT_GENDER IN ('M', 'W'))
);
UNIQUE KEY | STUDENT_ID VARCHAR2(500) CONSTRAINT UK_STUDENT UNIQUE, |
NOT NULL | STUDENT_GENDER CHAR(1) DEFAULT 'W' NOT NULL |
CHECK | CONSTRAINT CHECK_GENDER CHECK(STUDENT_GENDER IN ('M', 'W')) |
INSERT INTO TBL_STUDENT
(STUDENT_NUMBER, STUDENT_ID, STUDENT_NAME, STUDENT_MAJOR, STUDENT_GENDER)
VALUES(1, 'SSARRI', '홍싸리', '유아교육과', 'W');
-- [ERROR CASE 1] ================================================================
INSERT INTO TBL_STUDENT
(STUDENT_NUMBER, STUDENT_ID, STUDENT_NAME, STUDENT_MAJOR, STUDENT_GENDER)
VALUES(2, 'SSARRI', '홍길동', '역사학과', 'M');
-- UNIQUE KEY('GILDONG')도 중복되면 안 됨
-- [//ERROR CASE 1] ================================================================
INSERT INTO TBL_STUDENT
(STUDENT_NUMBER, STUDENT_ID, STUDENT_NAME, STUDENT_MAJOR, STUDENT_GENDER)
VALUES(2, 'GILDONG', '홍길동', '역사학과', 'M');
INSERT INTO TBL_STUDENT
(STUDENT_NUMBER, STUDENT_ID, STUDENT_NAME, STUDENT_MAJOR, STUDENT_GENDER)
VALUES(3, 'UNJI', '정은지', '연기학과', 'W');
INSERT INTO TBL_STUDENT
(STUDENT_NUMBER, STUDENT_ID, STUDENT_NAME, STUDENT_MAJOR)
VALUES(4, 'SOM', '김소미', '경제');
-- [ERROR CASE 2] ================================================================
INSERT INTO TBL_STUDENT
(STUDENT_NUMBER, STUDENT_ID, STUDENT_NAME, STUDENT_MAJOR, STUDENT_GENDER)
VALUES(5, 'GATSBY', '개츠비', '재벌', 'K');
-- CHECK 에서 걸린다!
-- STUDENT_GENDER 에서 'M' 또는 'W'만 입력할 수 있도록 CHECK로 받아두었기 때문에 오류가 난다.
-- [//ERROR CASE 2] ================================================================
INSERT INTO TBL_STUDENT
(STUDENT_NUMBER, STUDENT_ID, STUDENT_NAME, STUDENT_MAJOR, STUDENT_GENDER)
VALUES(5, 'GATSBY', '개츠비', '재벌', 'M');
'📁 Language > 🛢️ SQL' 카테고리의 다른 글
[SQL] 무결성 (0) | 2024.03.21 |
---|---|
[SQL] 조합키(복합키) (0) | 2024.03.21 |
[SQL] DDL (CREATE, ALTER, DROP, TRUNCATE) (0) | 2024.03.20 |
[SQL] DML (SELECT, INSERT, UPDATE, DELETE) (0) | 2024.03.20 |
[SQL] SQL의 종류 - SQL명령어의 성격에 따라 분류한 것들 (0) | 2024.03.20 |