SQL과 제약 조건

윤태규·2023년 12월 19일
  1. SQL 제약조건
    1) 제약 조건(Constraint)이란?
    📌 제약 조건(Constraint)은 각 컬럼들간의 제한사항을 관리하고, 조건을 위반하는 데이터를 방지하여 데이터베이스의 무결성(Integrity)을 보장하는 규칙입니다.

무결성(Integrity)은 데이터가 결함없이 정확하고 완전한 상태를 의미합니다.
2) 제약 조건의 종류

  • 고유(Unique) 제약 조건 (Unique)
    • 테이블에 소속된 특정 컬럼이 중복된 키를 가질 수 없는 조건
    • 사용자 아이디, 이메일과 같은 고유한 정보를 저장할 때 사용합니다.
  • NULL 제약 조건 (Null)
    • 특정 컬럼이 아무런 값을 입력받지 않도록 설정하거나, 무조건 값을 입력 받도록 설정하는 조건
    • 데이터가 없다면, NULL을 저장하여, 데이터가 존재하지 않다는것을 표현합니다.
  • 기본 키 (Primary Key) 제약 조건 (Primary Key)
    • 테이블 내에서 각 행(row)고유하게 식별할 수 있도록 보장하는 조건
  • 외래 키 (Foreign Key) 제약 조건 (Foreign Key)
    - 데이터베이스를 설계할 때 가장 많은 고민을 하게 될 테이블 간의 관계를 설정하는 조건
    - 한 테이블의 컬럼(Column)이 다른 테이블의 특정 행(Row)을 참조하도록 설정하는 조건.
    3) 음식 주문앱 DB 설계 예시
    CREATE TABLE User
    (
    userId int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name varchar(255) NOT NULL UNIQUE
    );

CREATE TABLE Food
(
foodId int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
name varchar(255),
price int(11)
);

CREATE TABLE Order
(
orderId int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
userId int(11) NOT NULL,
foodId int(11) NOT NULL,
createdAt datetime NOT NULL DEFAULT NOW(),
FOREIGN KEY (foodId) REFERENCES Food (foodId)
ON DELETE NO ACTION
ON UPDATE CASCADE,
FOREIGN KEY (userId) REFERENCES User (userId)
ON DELETE NO ACTION
ON UPDATE CASCADE
);

  • 4) 기본 키(Primary Key) 제약 조건

    💡 **기본 키(Primary Key)**는 테이블에 있는 데이터를 **고유하게 구분**할 수 있는 정보를 나타내기 위해서 사용합니다.

    CREATE TABLE User
    (
    userId int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name varchar(255)
    );

  • 5) NULL 제약 조건
    💡 NULL 속성은 특정 컬럼에서 NULL값을 허용하거나, 허용하지 않도록 설정하는 조건입니다. NULL‘값이 없음’을 나타내는 속성입니다.
    CREATE TABLE User
    (
    userId int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name varchar(255) NOT NULL
    );

  • 6) 고유(Unique) 제약 조건
    💡 UNIQUE 제약 조건은 특정 컬럼에서 중복된 값이 허용되지 않도록 설정하는 조건입니다.
    CREATE TABLE User
    (
    userId int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name varchar(255) NOT NULL UNIQUE
    );

  • 7) 외래 키(Foreign Key) 제약 조건
    💡 외래 키(Foreign Key) 제약 조건은 테이블과 다른 테이블간의 관계를 맺을 때 사용하는 제약 조건입니다.
    CREATE TABLE Garden
    (
    gardenId int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    address varchar(255) NOT NULL
    );

CREATE TABLE GardenPlants
(
gardenPlantsId int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
GardenId int(11) NOT NULL,
name varchar(255) NOT NULL,
FOREIGN KEY (GardenId) REFERENCES Garden (gardenId)
);

  • 8) 외래 키(Foreign Key) 제약 조건 심화

    💡 외래 키의 경우 다른 테이블과 관계를 맺고 있는 참조 데이터가 **삭제(DELETE)**또는 **수정(UPDATE)**될 때 어떤 행위를 해야하는지 설정할 수 있습니다. 이런 행위를 수행하는 조건을 **[연계 참조 무결성 제약 조건](https://dev.mysql.com/doc/refman/8.0/en/create-table-foreign-keys.html)**이라고 정의합니다.

    연계 참조 무결성 제약 조건의 종류
    CASCADE
    참조하고 있는 개체가 변경/삭제 될 경우 함께 변경/삭제됩니다.
    ex) 사용자가 삭제된다면, 그 사용자의 모든 주문 내역도 삭제됩니다.
    FOREIGN KEY (UserId) REFERENCES Users(userId)
    ON DELETE CASCADE
    ON UPDATE CASCADE;

    NO ACTION
    참조하고 있는 개체가 변경/삭제 될 경우 아무런 행위를 하지 않고 에러가 발생하게됩니다.
    ex) 사용자를 삭제할 때, 사용자의 주문 내역이 아직 존재한다면, 삭제를 막습니다.
    FOREIGN KEY (UserId) REFERENCES Users(userId)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION;

    SET NULL
    참조하고 있는 개체가 변경/삭제 될 경우 현재 데이터를 NULL로 변경합니다.
    ex) 사용자가 삭제되면, 사용자의 주문 내역의 ‘사용자 ID’는 NULL로 변경됩니다.
    FOREIGN KEY (UserId) REFERENCES Users(userId)
    ON DELETE SET NULL
    ON UPDATE SET NULL;
    SET DEFAULT
    참조하고 있는 개체가 변경/삭제 될 경우 현재 데이터를 기본 값으로 변경합니다.
    ex) 사용자가 삭제되면, 사용자의 주문 내역의 ‘사용자 ID’는 기본 값으로 변경됩니다.
    FOREIGN KEY (UserId) REFERENCES Users(userId)
    ON DELETE SET DEFAULT
    ON UPDATE SET DEFAULT;

  • 9) SELECT JOIN 연산자
    💡 JOIN 연산자는 두 테이블 사이의 공통된 데이터를 기준으로 테이블을 연결하여 하나의 테이블처럼 조회 할 수 있게 해주는 연산자입니다.
    CREATE TABLE Users
    (
    userId int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    email varchar(255) NOT NULL,
    password varchar(255) NOT NULL
    );

CREATE TABLE Posts
(
postId int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
UserId int(11) NOT NULL,
title varchar(255) NOT NULL,
content varchar(255) NOT NULL,
FOREIGN KEY (UserId) REFERENCES Users (userId)
);

INSERT INTO Users (userId, email, password)
VALUES (1, 'AAAA', '1234'),
(2, 'BBBB', '1234');

INSERT INTO Posts (UserId, title, content)
VALUES (1, 'AAAA Title1', 'content'),
(1, 'AAAA Title2', 'content'),
(2, 'BBBB Title1', 'content'),
(2, 'BBBB Title2', 'content');
SELECT p.postId, p.title, p.content, u.email
FROM Posts as p
JOIN Users as u
ON p.UserId = u.userId;

profile
끝까지 가자

0개의 댓글