주요 요점
SQL 제약 조건을 활용하는 것은 모든 테이블에 일관성을 적용하여 데이터베이스의 무결성을 유지하는 데 필수적입니다. 이러한 제약 조건 중 하나인 NOT NULL 제약 조건은 지정된 열에 null 값을 입력하는 것을 금지하여 각 레코드에 유효한 정보가 포함되도록 보장합니다.
기본 키 제약 조건을 적용하는 것은 특정 열 또는 열 모음 내에서 데이터의 특이성을 보장하여 관계형 데이터베이스 테이블 내에서 중복 항목의 발생을 방지하는 효과적인 전략입니다.
외래 키 제약 조건은 테이블 간의 연결을 강화하여 이러한 연결을 손상시킬 수 있는 조작으로부터 보호하는 역할을 합니다. 이러한 제약 조건은 보조 테이블 내의 모든 항목이 기본 테이블에 연결되도록 보장합니다.
효과적인 데이터베이스는 다양한 애플리케이션에 필수적이지만, 정보 저장 및 조작을 위한 프로토콜이 확립되어 있지 않으면 무질서해지고 관리가 어려워질 수 있습니다.
SQL 제약 조건은 특정 테이블 내의 정보 저장에 대한 지침을 설정하기 때문에 데이터베이스 관리의 중요한 측면입니다. 이러한 제약 조건을 적용함으로써 시스템은 사전 정의된 규칙에 위배되는 데이터 저장 시도를 방지할 수 있습니다. 이는 궁극적으로 전체 데이터베이스에서 데이터의 정확성과 일관성을 보존하는 데 도움이 됩니다.
여러 종류의 SQL 제약 조건이 존재하며, 각 제약 조건은 데이터베이스 내에서 데이터 무결성 및 일관성을 관리하는 데 고유한 목적을 가지고 있습니다. 이러한 구조 중 특정 구조는 관계형 시스템 내에 저장된 정보의 정확성과 신뢰성을 보장하는 데 특히 유용합니다.
NOT NULL 제약 조건
기본적으로 데이터베이스 열은 Null 값의 허용을 허용합니다. Null은 값이 없음을 의미합니다. 반대로 NOT NULL 제약 조건은 열이 널 값을 거부하고 널이 아닌 값을 제공해야 한다는 것을 의무화합니다.
필수 조건은 모든 열에 해당 값이 있어야 한다는 것을 부과합니다. 그렇지 않으면 오류가 발생하므로 데이터베이스에 새 항목을 추가하기 전에 모든 null이 아닌 열에 대한 데이터를 제공해야 합니다.
이름과 같이 각 후원자와 관련된 특정 중요 데이터를 문서화해야 하는 Customers 테이블의 인스턴스를 생각해 보겠습니다. 이 요구 사항을 준수하려면 이러한 필수 필드에 NOT NULL 제약 조건을 적용하는 것이 좋습니다.
PostgreSQL 데이터베이스 내에서 NOT NULL 제약 조건을 활용하는 방법은 다음 예제를 통해 설명합니다:
CREATE TABLE Customers (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255) NOT NULL,
Mobile_No int NOT NULL,
Age int
);
나이 필드를 포함하지 않고 고객 레코드를 삽입하려고 하면 데이터베이스는 오류 발생 없이 이 작업을 등록합니다.
INSERT INTO Customers (ID, LastName, FirstName, Mobile_No)
VALUES (123456, 'Dior', 'Christian', 000);
FirstName 속성이 없는 레코드를 삽입하려고 시도하지만 데이터베이스 시스템은 응답으로 오류 알림을 생성합니다:
ERROR: null value in column "firstname" violates not-null constraint
Detail: Failing row contains (123456, Dior, null, 00, null).
기본 키 제약 조건
관계형 데이터베이스에서 키는 테이블 내의 각 튜플에 대한 식별자 역할을 하며, 고유한 속성을 갖습니다. 기본 키 제약 조건은 하나 이상의 열에 있는 데이터의 독점성을 보장하여 개별 행에 대한 단일 참조 지점 역할을 하며 동일한 테이블 내에서 정보의 중복을 방지합니다.
모든 관계형 데이터베이스에서 기본 키는 테이블의 각 레코드에 대한 식별자 역할을 하며 두 레코드가 동일한 값을 공유하지 않도록 보장합니다. 이는 기본 키가 널링할 수 없는 고유한 값으로 구성되도록 요구함으로써 달성됩니다. 또한 데이터베이스 내의 각 테이블은 반드시 하나의 기본 키만 보유해야 합니다. 특히, 기본 키는 단독 열 또는 이러한 목적을 위해 집합적으로 사용되는 여러 열로 구성될 수 있습니다.
고객 정보 데이터베이스를 구축할 때 각 개별 고객에 대한 고유 식별 코드를 설정하는 것이 필수적입니다. 이를 위해 고객 간 식별 번호의 중복을 방지하기 위해 기본 키 제약 조건을 구현하는 것이 좋습니다.
MySQL 데이터베이스 내에서 기본 키 제약 조건을 구현하려면 아래에 설명된 절차 단계를 따를 수 있습니다:
CREATE TABLE Customers (
ID int NOT NULL,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int,
PRIMARY KEY (ID)
);
데이터베이스는 이전에 입력한 데이터와 유사한 특성을 보이는 새로운 정보를 추가하려는 시도를 거부하여 데이터 입력에 제한을 가합니다. 특히, 사용자가 새 항목을 추가하고 고유 식별자(ID)를 할당하려고 시도한 후 다른 사용자가 동일한 ID를 가진 별도의 항목을 제출하면 시스템은 중복 콘텐츠가 있음을 나타내는 오류 메시지를 생성하도록 프로그래밍되어 있습니다. 이 시나리오는 두 개의 서로 다른 항목을 동시에 삽입하려고 시도하여 데이터베이스 내의 기존 데이터 복제를 금지하는 기존 규칙으로 인해 그 중 하나가 자동으로 거부되는 상황을 예시합니다.
INSERT INTO Customers (ID, LastName, FirstName, Age)
VALUES (1, 'John', 'Doe', 35 );
INSERT INTO Customers (ID, LastName, FirstName, Age)
VALUES (1, 'Mary', 'Jane', 35 );
데이터 처리 중에 발생한 불일치 또는 오작동으로 인해 데이터베이스 시스템 내에 문제가 있음을 나타내는 표시가 오류 메시지 형태로 표시됩니다.
Duplicate entry '1' for key 'PRIMARY'
기본 키의 구현은 이미 존재하는 식별자 값으로 레코드를 삽입하거나 업데이트하려는 시도를 거부할 수 있도록 함으로써 데이터베이스 내에서 고유 식별자의 중복을 방지하는 역할을 합니다. 이 원칙을 설명하는 실제 사례는 다른 고객에게 할당된 ID를 변경해도 데이터베이스가 고유성에 대한 제약으로 인해 해당 항목을 감지하고 거부하기 때문에 데이터베이스가 이를 허용하지 않는 경우입니다. 따라서 기본 키를 사용하면 각 고객의 기록이 고유하고 반복되지 않는 식별자를 보유하도록 효과적으로 보장할 수 있습니다.
외래 키 제약 조건
외래 키는 공유 기본 키 값을 기반으로 연결을 생성하여 여러 테이블 간의 상호 연결을 용이하게 합니다. 외래 키는 다른 테이블의 기본 키에 해당하는 한 테이블 내의 열 또는 필드에 대한 참조로 추가됩니다.
한 테이블에 기본 키가 있고 다른 테이블에 전자를 참조하는 외래 키가 있는 관계형 데이터베이스 스키마에서 기본 키가 있는 테이블은 “상위” 엔터티 역할을 하는 반면, 외래 키를 통합한 테이블은 “하위” 엔터티 역할을 합니다. 따라서 부모 테이블에 포함된 정보를 먼저 참조하지 않고는 자식 테이블 내의 어떤 항목도 유효성을 검사할 수 없습니다.
외래 키 제약 조건은 테이블 간 관계의 무결성을 손상시킬 수 있는 모든 작업에 대한 장애물 역할을 합니다. 특히 다른 테이블의 외래 키가 참조하는 테이블에서 행을 삭제하거나 제거하려는 시도는 이 제약 조건을 위반하여 오류가 발생하므로 금지됩니다. 이러한 제약 조건을 제거하려면 외래 키가 포함된 단일 테이블이 아니라 관계에 관련된 두 테이블에 대해 동시에 작업을 수행해야 합니다.
기본 키는 고유하며 단일 테이블 내에서 복제할 수 없는 반면, 외래 키는 여러 인스턴스를 가질 수 있고 null 값을 허용할 수 있습니다. 예를 들어 주문을 생성할 때 다른 테이블에서 고객 ID를 참조하여 두 테이블 간의 연결을 설정해야 합니다.
CREATE TABLE Customers (
customer_id INT PRIMARY KEY,
first_name VARCHAR(50),
last_name VARCHAR(50)
);
CREATE TABLE Orders (
order_id INT PRIMARY KEY,
customer_id INT,
order_date DATE,
FOREIGN KEY (customer_id) REFERENCES Customers(customer_id)
);
INSERT INTO Customers(customer_id, first_name, last_name)
VALUES (1, 'Christian', 'Dior');
INSERT INTO Orders(order_id, customer_id, order_date)
VALUES (1, 1, '2023-08-07');
고객에 대한 기존 식별자를 활용하지 않고 트랜잭션을 생성하려고 하면 데이터베이스 관리 시스템에 불일치 또는 오작동 표시가 표시됩니다.
Cannot add or update a child row: a foreign key constraint fails
(`db_9_4ee205c`.`orders`, CONSTRAINT `orders_ibfk_1` FOREIGN KEY
(`customer_id`) REFERENCES `customers` (`customer_id`))
고유 제약 조건
특정 열 내의 각 행이 반복되는 값을 갖지 않도록 보장하기 위해 고유 제약 조건이 구현됩니다. 기본 키와 마찬가지로 이 제약 조건은 데이터의 정확성을 유지하고 중복된 레코드가 저장되는 것을 방지하는 역할을 합니다. 이러한 제약 조건이 없는 불완전하게 구조화된 데이터베이스로 작업하는 경우 중복된 정보를 식별하고 제거해야 합니다.
일반적으로 레코드당 단일 인스턴스로 제한되는 기본 키와 달리, 테이블에 여러 개의 고유 제약 조건이 적용될 수 있습니다. 이 개념을 설명하기 위해 ID 및 전화번호 필드가 모두 각 고객에게 고유하게 할당되어야 하는 “Customers” 테이블을 생성한다고 가정해 보겠습니다. MySQL 데이터베이스 관리 시스템 내에서 이 요구 사항을 구현하려면 다음 구문을 활용하세요:
CREATE TABLE Customers (
ID int NOT NULL UNIQUE,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Mobile_No BIGINT UNIQUE
);
특정 휴대폰 번호를 고유 식별자로 사용하여 데이터베이스 내에서 중복 항목이 생성되면 사용자에게 이러한 중복을 알리는 오류 메시지가 생성된다는 점에 유의해야 합니다.
INSERT INTO Customers (ID, LastName, FirstName, Mobile_No)
VALUES (123456, 'Dior', 'Christian', 00 );
INSERT INTO Customers (ID, LastName, FirstName, Mobile_No)
VALUES (, 'Dedan', 'Kimathi', 00 );
“오류 404: 페이지를 찾을 수 없습니다. 요청한 페이지를 서버에서 찾을 수 없습니다.
Duplicate entry '00' for key 'Mobile_No'
이 데이터베이스에 구현된 UNIQUE 제약 조건은 두 레코드가 고객 ID 또는 휴대폰 번호에 대해 동일한 값을 갖지 않도록 하여 데이터 항목 간의 고유성을 유지해야 한다는 요구 사항을 부과합니다.
CHECK 제약 조건
CHECK 제약 조건은 특정 열에 입력할 수 있는 허용 값을 제한하여 해당 열에 저장되는 데이터의 정확성과 일관성을 유지하는 역할을 합니다. 특정 열에 이러한 제약 조건을 구현하면 사전 승인된 특정 값만 입력할 수 있도록 보장하여 데이터베이스에 포함된 정보의 전반적인 품질과 신뢰성을 유지할 수 있습니다.
CHECK 제약 조건을 효과적으로 활용하기 위해서는 평가자가 테이블의 지정된 행 또는 항목 내의 모든 데이터 인스턴스에 대해 제공된 값이 참인지 알 수 없는지 판단하는 것이 필수적입니다. 평가 결과가 거짓인 경우 시스템에서 오류 알림을 표시합니다.
성년에 도달한 개인만 Customers 테이블에 액세스할 수 있도록 제한하기 위해 PostgreSQL 데이터베이스 관리 시스템 내에서 확인 제약 조건을 구현할 수 있습니다.
CREATE TABLE Customers (
ID int NOT NULL,
Age int CHECK(Age>=18),
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Mobile_No BIGINT UNIQUE
);
18세 미만인 고객의 나이를 입력하려고 하면
INSERT INTO Customers (ID, Age, LastName, FirstName, Mobile_No)
VALUES (123456, 15, 'Dior', 'Christian', 000 );
다음과 같이 데이터베이스에 문제가 있다는 표시가 오류 메시지 형태로 표시됩니다:
ERROR: new row for relation "customers" violates check constraint
"customers_age_check"
Detail: Failing row contains (123456, 15, Dior, Christian, 000)
데이터베이스에서 SQL 제약 조건을 추가 및 제거하는 방법
SQL 제약 조건은 처음에는 엄격하게 보일 수 있지만 실제로는 ALTER TABLE 문을 사용하여 수정할 수 있습니다. 이 문을 사용하면 필요에 따라 기존 테이블에서 제약 조건을 추가하거나 제거할 수 있으므로 특정 데이터 요구 사항에 따라 유연성을 높이고 사용자 지정할 수 있습니다.
여기에 설명된 제약 조건 외에 추가 SQL 제약 조건을 통합하면 데이터베이스 설계 기본 설정을 더욱 세분화하고 사용자 지정할 수 있습니다. 앞서 언급한 목록은 이러한 옵션을 탐색하는 데 훌륭한 출발점이 됩니다.