728x90
1. Constarint(제약 조건)이란?
💡 SQL에서 제약조건(constraint)은 데이터베이스의 무결성을 유지하기 위해 사용되는 규칙이다. 제약조건을 사용하면 데이터베이스에 잘못된 데이터가 들어가지 않도록 방지할 수 있다. 여기서는 대표적인 제약조건인 NOT NULL, UNIQUE, PRIMARY KEY, FOREIGN KEY, CHECK, DEFAULT에 대해 설명하겠다.
1-1. NOT NULL 제약조건
💡 NOT NULL 제약조건은 특정 컬럼에 NULL 값을 허용하지 않는다. 컬럼 레벨에서만 제약조건을 추가할 수 있다.
DROP TABLE IF EXISTS user_notnull;
CREATE TABLE IF NOT EXISTS user_notnull (
user_no INT NOT NULL,
user_id VARCHAR(255) NOT NULL,
user_pwd VARCHAR(255) NOT NULL,
user_name VARCHAR(255) NOT NULL,
gender VARCHAR(3),
phone VARCHAR(255) NOT NULL,
email VARCHAR(255)
) ENGINE=INNODB;
INSERT INTO user_notnull (user_no, user_id, user_pwd, user_name, gender, phone, email)
VALUES (1, 'user01', 'pass01', '홍길동', '남', '010-1234-5678', 'hong123@gmail.com'),
(2, 'user02', 'pass02', '유관순', '여', '010-777-7777', 'yu77@gmail.com');
-- name 컬럼이 NULL이면 에러가 발생합니다.
INSERT INTO user_notnull (user_no, user_id, user_pwd, user_name, gender, phone, email)
VALUES (3, 'user03', 'pass03', NULL, '남', '010-1234-5677', 'hong1234@gmail.com');
1-2. UNIQUE 제약조건
💡 UNIQUE 제약조건은 특정 컬럼에 중복된 값을 허용하지 않는다. 컬럼 레벨 및 테이블 레벨에서 모두 설정할 수 있다.
DROP TABLE IF EXISTS user_unique;
CREATE TABLE IF NOT EXISTS user_unique (
user_no INT NOT NULL UNIQUE,
user_id VARCHAR(255) NOT NULL,
user_pwd VARCHAR(255) NOT NULL,
user_name VARCHAR(255) NOT NULL,
gender VARCHAR(3),
phone VARCHAR(255) NOT NULL,
email VARCHAR(255)
) ENGINE=INNODB;
INSERT INTO user_unique (user_no, user_id, user_pwd, user_name, gender, phone, email)
VALUES (1, 'user01', 'pass01', '홍길동', '남', '010-1234-5678', 'hong123@gmail.com'),
(2, 'user02', 'pass02', '유관순', '여', '010-777-7777', 'yu77@gmail.com');
-- user_no가 중복되면 에러가 발생합니다.
INSERT INTO user_unique (user_no, user_id, user_pwd, user_name, gender, phone, email)
VALUES (3, 'user03', 'pass01', '홍길동2', '남', '010-1234-5678', 'hong1234@gmail.com');
1-3. PRIMARY KEY 제약조건
💡 PRIMARY KEY 제약조건은 NOT NULL과 UNIQUE 제약조건을 합친 형태로, 한 테이블에 반드시 하나의 기본 키(primary key)에 있으며, 이 기본키에 적용한다.
DROP TABLE IF EXISTS user_primarykey;
CREATE TABLE IF NOT EXISTS user_primarykey (
user_no INT,
user_id VARCHAR(255) NOT NULL,
user_pwd VARCHAR(255) NOT NULL,
user_name VARCHAR(255) NOT NULL,
gender VARCHAR(3),
phone VARCHAR(255) NOT NULL,
email VARCHAR(255),
PRIMARY KEY(user_no)
) ENGINE=INNODB;
DESC user_primarykey;
SELECT * FROM user_primarykey;
INSERT INTO user_primarykey (user_no, user_id, user_pwd, user_name, gender, phone, email)
VALUES (1, 'user01', 'pass01', '홍길동', '남', '010-1234-5678', 'hong123@gmail.com'),
(2, 'user02', 'pass02', '유관순', '여', '010-777-7777', 'yu77@gmail.com');
INSERT INTO user_primarykey (user_no, user_id, user_pwd, user_name, gender, phone, email)
VALUES (3, 'user012', 'pass012', '홍길동', '남', '010-1234-5678', 'hong123@gmail.com');
1-4. FOREIGN KEY 제약조건
💡 FOREIGN KEY 제약조건은 두 테이블 간의 관계를 형성하여 데이터의 일관성을 유지한다. 자식 테이블의 특정 컬럼이 부모 테이블의 기본 키를 참조한다.
-- 부모 테이블 생성
DROP TABLE IF EXISTS user_grade;
CREATE TABLE IF NOT EXISTS user_grade(
grade_code INT NOT NULL UNIQUE,
grade_name VARCHAR(255) NOT NULL
);
-- 자식 테이블 생성
DROP TABLE IF EXISTS user_foreignkey1;
CREATE TABLE IF NOT EXISTS user_foreignkey1 (
user_no INT PRIMARY KEY,
user_id VARCHAR(255) NOT NULL,
user_pwd VARCHAR(255) NOT NULL,
user_name VARCHAR(255) NOT NULL,
gender VARCHAR(3),
phone VARCHAR(255) NOT NULL,
email VARCHAR(255),
grade_code INT,
FOREIGN KEY (grade_code) REFERENCES user_grade(grade_code)
) ENGINE=INNODB;
INSERT INTO user_grade VALUES (10, '일반회원'), (20, '우수회원'), (30, '특별회원');
INSERT INTO user_foreignkey1 VALUES
(1, 'user01', 'pass01', '홍길동', '남', '010-111-2222', 'hong@gmail.com', 10),
(2, 'user01', 'pass01', '홍길동', '남', '010-111-2222', 'hong@gmail.com', 20);
SELECT * FROM user_foreignkey1;
-- 잘못된 외래 키 값 입력시 에러 발생
INSERT INTO user_foreignkey1 VALUES
(3, 'user01', 'pass01', '홍길동', '남', '010-111-2222', 'hong@gmail.com', NULL);
INSERT INTO user_foreignkey1 VALUES
(4, 'user01', 'pass01', '홍길동', '남', '010-111-2222', 'hong@gmail.com', 40);
-- 외래키 삭제시 발생하는 규칙 확인
DELETE FROM user_grade WHERE grade_code=10;
1-5. CHECK 제약조건
💡 CHECK 제약조건은 특정 컬럼의 값이 조건식에 부합하는지 확인한다.
DROP TABLE IF EXISTS user_check;
CREATE TABLE IF NOT EXISTS user_check(
user_no INT AUTO_INCREMENT PRIMARY KEY,
user_name VARCHAR(255) NOT NULL,
gender VARCHAR(3) CHECK(gender IN ('남', '여')),
age INT CHECK(age >= 19)
) ENGINE=INNODB;
INSERT INTO user_check VALUES
(NULL, '홍길동', '남', 25),
(NULL, '이순신', '남', 33);
SELECT * FROM user_check;
-- 잘못된 값 입력시 에러 발생
INSERT INTO user_check VALUES
(NULL, '아메바', '중', 19);
INSERT INTO user_check VALUES
(NULL, '유관순', '여', 16);
1-6. DEFAULT 제약조건
💡 DEFAULT 제약조건은 특정 컬럼에 값이 지정되지 않았을 때 기본값을 설정한다.
DROP TABLE IF EXISTS tbl_country;
CREATE TABLE IF NOT EXISTS tbl_country(
country_code INT AUTO_INCREMENT PRIMARY KEY,
country_name VARCHAR(255) DEFAULT '한국',
population VARCHAR(255) DEFAULT '0명',
add_date DATE DEFAULT (CURRENT_DATE),
add_time DATETIME DEFAULT (CURRENT_TIME)
) ENGINE=INNODB;
-- 기본값 적용 예제
INSERT INTO tbl_country VALUES
(NULL, DEFAULT, DEFAULT, DEFAULT, DEFAULT);
SELECT * FROM tbl_country;
728x90
'수업자료 > database' 카테고리의 다른 글
[SQL]-TRIGGER (0) | 2024.06.27 |
---|---|
[SQL]-VIEW (0) | 2024.06.27 |
[SQL]-DDL (1) | 2024.06.26 |
[SQL]-TRANSACTION (0) | 2024.06.26 |
[SQL]-DML (0) | 2024.06.26 |