SQL - Check 제약 조건: 데이터 무결성을 위한 친절한 가이드
안녕하세요, 미래의 SQL 마법사 여러분! 오늘 우리는 SQL Check 제약 조건의 마법의 세계로 들어가 볼 거예요. 프로그래밍에 처음 도전하는 사람이라면 걱정 마세요 - 이 여정에서 여러분의 가이드가 되어드리겠습니다. 단계별로 차근차근 설명해 나갈 테니, 좋아하는 음료를 한 잔 들고 편안하게 앉아 있자고요. 그럼 시작해 보겠습니다!
SQL CHECK 제약 조건: 여러분의 데이터의 최고 친구
파티를 준비하고, 만 18세 이상의 손님들만 참석할 수 있도록 하고 싶은 상황을 상상해 보세요. 이게 exactamente SQL의 CHECK 제약 조건이 하는 일입니다 - 데이터베이스의 보안 경비원처럼, 올바른 데이터만 들어오도록 보장합니다!
CHECK 제약 조건은 테이블의 열(또는 여러 개의 열)에 설정된 규칙으로, 데이터가 들어오기 전에 특정 조건을 만족해야 한다는 것입니다. 데이터베이스가 데이터 무결성을 유지할 수 있는 초능력을 부여하는 것과 같아요!
그럼 몇 가지 예제를 보아서 이해를 돕겠습니다.
단일 열에 적용된 CHECK 제약 조건: 솔로 공연
단일 열에 CHECK 제약 조건을 적용할 때, 우리는 그 열에게 "Hey, 너는 이 하나의 임무를 가지고 있어 - 이 규칙을 따르는 데이터를 보장해!"라고 말하는 것입니다.
다음은 예제입니다:
CREATE TABLE Employees (
EmployeeID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
Age INT CHECK (Age >= 18)
);
이 예제에서 우리는 Employees 테이블을 만들고 Age 열에 CHECK 제약 조건을 설정했습니다. 이 제약 조건은 입력된 나이가 18세 이상인지 확인합니다. 만약 누군가 18세 미만의 직원을 입력하려고 시도하면, 데이터베이스는 예의를 갖추고 거부합니다. 파티의 보안 경비원처럼!
그럼 데이터를 입력해 보겠습니다:
-- 이 작업은 성공합니다
INSERT INTO Employees (EmployeeID, FirstName, LastName, Age)
VALUES (1, 'John', 'Doe', 25);
-- 이 작업은 실패합니다
INSERT INTO Employees (EmployeeID, FirstName, LastName, Age)
VALUES (2, 'Jane', 'Smith', 17);
첫 번째 INSERT 문은 25가 18 이상이므로 성공합니다. 그러나 두 번째 INSERT 문은 17이 제약 조건을 만족하지 못하기 때문에 실패합니다. 우리의 데이터 보안 경비원이 역할을 하고 있습니다!
다중 열에 적용된 CHECK 제약 조건: 동반 공연
때로는 두 개 이상의 열에 걸린 조건을 확인해야 할 때가 있습니다. 그때는 다중 열 CHECK 제약 조건이 유용합니다!
다음은 예제입니다:
CREATE TABLE Orders (
OrderID INT PRIMARY KEY,
OrderDate DATE,
ShipDate DATE,
CHECK (ShipDate >= OrderDate)
);
이 Orders 테이블에서 우리는 ShipDate가 항상 OrderDate 이후인지 확인하고 있습니다. 주문이 접수된 후 배송되는 것은 당연히 그렇죠. SQL은 아직 시간 여행을 할 수 있는 수준이 아닙니다...
이를 테스트해 보겠습니다:
-- 이 작업은 성공합니다
INSERT INTO Orders (OrderID, OrderDate, ShipDate)
VALUES (1, '2023-06-01', '2023-06-03');
-- 이 작업은 실패합니다
INSERT INTO Orders (OrderID, OrderDate, ShipDate)
VALUES (2, '2023-06-01', '2023-05-31');
첫 번째 INSERT 문은 ShipDate가 OrderDate 이후이므로 성공합니다. 두 번째 INSERT 문은 주문이 접수된 이전에 배송되려고 시도하기 때문에 실패합니다. 우리의 시간 경비원 CHECK 제약 조건이 이를 잡아냅니다!
테이블 수준의 CHECK 제약 조건: 전지全能의 눈
때로는 여러 개의 열에 걸린 제약 조건을 설정하고 싶지만, 특정 열에 연결되지 않고 싶을 때가 있습니다. 이를 위해 테이블 수준의 제약 조건을 만들 수 있습니다.
다음은 그 예입니다:
CREATE TABLE Products (
ProductID INT PRIMARY KEY,
ProductName VARCHAR(50),
UnitPrice DECIMAL(10,2),
DiscountedPrice DECIMAL(10,2),
CONSTRAINT CHK_Price CHECK (DiscountedPrice <= UnitPrice)
);
이 Products 테이블에서 우리는 DiscountedPrice가 항상 UnitPrice 이하인지 확인하고 있습니다. 할인된 가격이 원래 가격보다 높아지는 일은 원치 않죠!
이를 실제로 보겠습니다:
-- 이 작업은 성공합니다
INSERT INTO Products (ProductID, ProductName, UnitPrice, DiscountedPrice)
VALUES (1, 'Super Gadget', 99.99, 79.99);
-- 이 작업은 실패합니다
INSERT INTO Products (ProductID, ProductName, UnitPrice, DiscountedPrice)
VALUES (2, 'Mega Widget', 49.99, 59.99);
첫 번째 INSERT 문은 DiscountedPrice가 UnitPrice 이하이므로 성공합니다. 두 번째 INSERT 문은 DiscountedPrice가 UnitPrice보다 높으므로 실패합니다. 우리의 CHECK 제약 조건이 이를 막아줍니다!
기존 열에 CHECK 제약 조건 추가: 리퍼트
이미 테이블이 있고, 거기에 CHECK 제약 조건을 추가하고 싶다면 어떻게 하나요? 걱정 마세요! 기존 열에도 제약 조건을 추가할 수 있습니다.
다음은 그 방법입니다:
-- 먼저 제약 조건이 없는 테이블을 만듭니다
CREATE TABLE Students (
StudentID INT PRIMARY KEY,
FirstName VARCHAR(50),
LastName VARCHAR(50),
GPA DECIMAL(3,2)
);
-- 이제 CHECK 제약 조건을 추가합니다
ALTER TABLE Students
ADD CONSTRAINT CHK_GPA CHECK (GPA >= 0.0 AND GPA <= 4.0);
이 예제에서 우리는 GPA가 항상 0.0과 4.0 사이에 있는지 확인하고 있습니다.
이를 테스트해 보겠습니다:
-- 이 작업은 성공합니다
INSERT INTO Students (StudentID, FirstName, LastName, GPA)
VALUES (1, 'Alice', 'Johnson', 3.75);
-- 이 작업은 실패합니다
INSERT INTO Students (StudentID, FirstName, LastName, GPA)
VALUES (2, 'Bob', 'Smith', 4.5);
첫 번째 INSERT 문은 GPA가 허용된 범위 내이므로 성공합니다. 두 번째 INSERT 문은 GPA가 허용된 범위를 초과하므로 실패합니다. 우리의 리퍼트 CHECK 제약 조건이 역할을 하고 있습니다!
CHECK 제약 조건 제거: 대脱출
때로는 CHECK 제약 조건을 제거해야 할 수 있습니다. 비즈니스 규칙이 바뀌었거나 데이터베이스를 다시 구성하고 싶을 때 등 다양한 이유로 말이죠. SQL은 제약 조건을 제거하는 방법을 제공합니다.
다음은 그 방법입니다:
-- 이름이 지정된 제약 조건을 제거합니다
ALTER TABLE Students
DROP CONSTRAINT CHK_GPA;
-- 이름이 지정되지 않은 제약 조건을 제거합니다 (SQL Server 문법)
ALTER TABLE Employees
DROP CONSTRAINT ALL;
그렇게 하면 제약 조건이 사라집니다! 하지만 권한이 큰 만큼 책임도 큽니다. 제약 조건을 제거하기 전에 정말로 그럴 의도가 있는지 확인하세요!
결론: 데이터 무결성 도구箱
이제 여러분은 SQL CHECK 제약 조건의 세계를 여행했네요. 단일 열 경비원에서 다중 열 경비원, 테이블 수준의 감시자에서 제약 조건 제거자까지!
CHECK 제약 조건은 여러분의 데이터 왕국의 충실한 경비원입니다. 그들은 데이터 무결성을 유지하고, 데이터베이스가 깨끗하고 일관성 있고 신뢰할 수 있도록 하는 데 열심히 일합니다.
SQL 여정을 계속하면서 이 CHECK 제약 조건들을 도구箱에 넣어 두세요. 그들은 데이터 무결성을 유지하고 악한 데이터 그림자를 막는 데 유용한 동반자가 될 것입니다.
이제 자신감을 가지고 제약 조건을 설정해 보세요! 행복한 SQL을 기원합니다!
Credits: Image by storyset