기본 키 및 외래 키 입력 SQLite 예와 함께
⚡ 스마트 요약
기본 키와 외래 키 SQLite 모든 행을 고유하게 식별하고 관련 테이블을 연결하여 데이터 무결성을 강화하고, 참조된 값이 항상 존재하도록 보장하며, 관계형 데이터베이스 전체에서 중복, null 또는 고립된 레코드가 발생하는 것을 방지합니다.

아래 섹션에서 설명합니다 SQLite 테이블을 정의하고 연결하는 기본 키(PRIMARY KEY)와 외래 키(FOREIGN KEY)부터 시작하여 각 열의 데이터를 검증하는 NOT NULL, DEFAULT, UNIQUE, CHECK 규칙에 이르기까지 제약 조건을 자세히 설명합니다.
SQLite 제약
컬럼 제약 조건은 데이터의 유효성을 검사하기 위해 컬럼에 삽입되는 값에 규칙을 적용합니다. 이러한 제약 조건은 테이블을 생성할 때 컬럼 정의 내에 설정됩니다. 제약 조건은 중복, null 값 또는 관련 테이블에 존재하지 않는 값과 같이 설정한 규칙을 위반하는 값을 거부함으로써 저장된 데이터의 일관성과 정확성을 유지합니다.
SQLite 기본 키
기본 키 열의 모든 값은 고유해야 하며 null이 아니어야 합니다. 기본 키는 테이블의 각 행을 고유하게 식별합니다.
기본 키는 단일 열 또는 여러 열의 조합에 적용할 수 있습니다. 후자의 경우, 해당 열 값들의 조합은 테이블의 모든 행에서 고유해야 합니다.
구문 :
테이블에서 기본 키를 정의하는 방법에는 여러 가지가 있습니다.
열 정의 자체에서:
ColumnName INTEGER NOT NULL PRIMARY KEY;
별도의 정의로서:
PRIMARY KEY(ColumnName);
열 조합을 기본 키로 생성하려면 다음을 수행합니다.
PRIMARY KEY(ColumnName1, ColumnName2);
SQLite NOT NULL, DEFAULT, UNIQUE 및 CHECK 제약 조건
기본 키 외에도, SQLite 테이블에 입력된 값을 검증하는 여러 열 제약 조건을 제공합니다. NOT NULL, DEFAULT, UNIQUE 및 CHECK 제약 조건은 각각 열 정의에 정의되며, 각 제약 조건은 해당 열의 특정 규칙을 적용합니다. 데이터 형식 그리고 가치.
NOT NULL 제약
The SQLite NOT NULL 제약 조건은 해당 열에 null 값이 들어가는 것을 방지합니다.
ColumnName INTEGER NOT NULL;
기본 제약
와 더불어 SQLite DEFAULT 제약 조건은 열에 아무 값도 입력하지 않으면 기본값이 대신 입력되는 기능입니다.
예 :
ColumnName INTEGER DEFAULT 0;
삽입문을 작성할 때 해당 열에 값을 지정하지 않으면 해당 열에는 0의 값이 저장됩니다.
고유한 제약
The SQLite UNIQUE 제약 조건은 해당 열의 모든 값 사이에 중복된 값이 발생하는 것을 방지합니다.
예 :
EmployeeId INTEGER NOT NULL UNIQUE;
이는 "EmployeeId" 값이 고유해야 함을 강제하며, 중복된 값은 허용되지 않습니다. 단, 이는 "EmployeeId" 열의 값에만 적용됩니다.
CHECK 제약 조건
The SQLite CHECK 제약 조건은 삽입된 값을 확인하는 조건을 설정합니다. 값이 조건과 일치하지 않으면 삽입되지 않습니다.
Quantity INTEGER NOT NULL CHECK(Quantity > 10);
"수량" 열에는 10보다 작은 값을 입력할 수 없습니다.
SQLite 외래 키
The SQLite 외래 키는 외래 키가 정의된 첫 번째 테이블과 관계를 맺고 있는 다른 테이블에 특정 값이 존재하는지 확인하는 제약 조건입니다.
여러 테이블을 다룰 때, 두 테이블이 공통 열을 통해 서로 연결되는 경우가 있습니다. 한 테이블에 삽입된 값이 다른 테이블의 해당 열에도 반드시 존재해야 하도록 하려면, 공통 열에 외래 키 제약 조건을 사용해야 합니다.
이 경우 해당 열에 값을 삽입하려고 하면 외래 키가 삽입하려는 값이 참조된 테이블의 열에 이미 존재하는지 확인합니다.
참고로 외래 키 제약 조건은 기본적으로 활성화되어 있지 않습니다. SQLite먼저 다음 명령어를 실행하여 해당 기능을 활성화해야 합니다.
PRAGMA foreign_keys = ON;
외래 키 제약 조건이 도입되었습니다. SQLite 버전 3.6.19부터.
예 SQLite 외래 키
학생 목록과 학과 목록이라는 두 개의 테이블이 있다고 가정해 봅시다.
Students 테이블에는 학생 목록이 있고, Departments 테이블에는 학과 목록이 있습니다. 각 학생은 특정 학과에 소속되어 있으며, 즉 각 학생은 departmentId 열을 가지고 있습니다.
이제 외래 키 제약 조건을 사용하여 학생 테이블의 학과 ID 값이 부서 테이블에 반드시 존재하도록 하는 방법을 살펴보겠습니다.
따라서 Students 테이블의 DepartmentId에 외래 키 제약 조건을 생성하면 삽입된 각 departmentId는 Departments 테이블에 반드시 존재해야 합니다.
CREATE TABLE [Departments] ( [DepartmentId] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, [DepartmentName] NVARCHAR(50) NULL ); CREATE TABLE [Students] ( [StudentId] INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, [StudentName] NVARCHAR(50) NULL, [DepartmentId] INTEGER NOT NULL, [DateOfBirth] DATE NULL, FOREIGN KEY(DepartmentId) REFERENCES Departments(DepartmentId) );
외래 키 제약 조건이 다른 테이블과 관계를 맺고 있는 테이블에 정의되지 않은 요소나 값이 삽입되는 것을 어떻게 방지하는지 확인하기 위해 다음 예제를 살펴보겠습니다.
이 예시에서 Departments 테이블은 Students 테이블과 외래 키 관계를 맺고 있으므로 Students 테이블에 삽입되는 departmentId 값은 반드시 Departments 테이블에 존재해야 합니다. Departments 테이블에 존재하지 않는 departmentId 값을 삽입하려고 하면 외래 키 제약 조건 때문에 삽입이 불가능합니다.
다음과 같이 "IT"와 "예술" 두 부서를 부서 테이블에 추가해 보겠습니다. 삽입 쿼리:
INSERT INTO Departments VALUES(1, 'IT'); INSERT INTO Departments VALUES(2, 'Arts');
두 개의 명령문은 Departments 테이블에 두 개의 부서를 삽입해야 합니다. 삽입 후 "SELECT * FROM Departments" 쿼리를 실행하여 두 값이 제대로 삽입되었는지 확인할 수 있습니다.
그런 다음 Departments 테이블에 존재하지 않는 departmentId를 가진 새 학생을 삽입해 보세요.
INSERT INTO Students(StudentName,DepartmentId) VALUES('John', 5);
해당 행은 삽입되지 않고 "외래 키 제약 조건 위반" 오류 메시지가 표시됩니다.
기본 키와 외래 키의 차이점 SQLite
기본 키와 외래 키는 모두 데이터 무결성을 유지하는 데 도움이 되지만, 역할은 다릅니다. 기본 키는 단일 테이블 내의 행을 식별하는 반면, 외래 키는 서로 관련된 두 테이블의 행을 연결합니다. 아래 표는 주요 차이점을 요약한 것입니다.
| 베이스 | 기본 키 | 외래 키 |
|---|---|---|
| 목적 | 각 테이블의 각 행을 고유하게 식별합니다. | 두 테이블을 연결하기 위해 다른 테이블의 기본 키를 참조합니다. |
| 고유성 | 값은 고유해야 합니다. | 값이 중복될 수 있으므로 여러 자식 행이 하나의 부모 행을 공유할 수 있습니다. |
| 널 값 | null일 수 없습니다. | 관계가 선택 사항인 경우 null일 수 있습니다. |
| 테이블당 인원수 | 테이블당 기본 키는 하나만 허용됩니다. | 테이블은 여러 개의 외래 키를 가질 수 있습니다. |
| 색인 | 자동으로 인덱싱됨 | 자동으로 인덱싱되지 않습니다. 성능 향상을 위해 인덱싱을 추가하세요. |
학생 및 학과 예시에서 DepartmentId는 Departments 테이블의 기본 키이자 Students 테이블의 외래 키이며, 이를 통해 각 학생이 유효한 학과와 연결됩니다.
SQLite 복합 기본 키
복합 기본 키는 두 개 이상의 열로 구성된 기본 키입니다. 이는 단일 열로는 고유하지 않지만, 여러 열을 조합하면 모든 행에서 고유한 값을 가질 때 사용됩니다. SQLite 결합된 값을 하나의 키로 처리합니다.
예를 들어, 수강 신청표에서는 한 학생이 여러 과목을 수강할 수 있고, 여러 학생이 같은 과목을 수강할 수도 있지만, 각 학생-과목 조합은 한 번만 나타나야 합니다.
CREATE TABLE Enrollments ( StudentId INTEGER NOT NULL, CourseId INTEGER NOT NULL, Grade TEXT, PRIMARY KEY (StudentId, CourseId) );
여기서 StudentId와 CourseId는 각각 단독으로는 고유하지 않지만, (StudentId, CourseId) 쌍은 고유하므로 동일한 학생이 같은 강좌에 두 번 등록할 수 없습니다. 복합 키를 사용할 때 다음 사항에 유의하십시오.
- 단일 열로는 행을 고유하게 식별할 수 없는 경우 복합 키를 사용하십시오.
- 복합 키의 모든 열은 기본 키 규칙을 따르므로 결합된 값은 고유해야 하며 null이 아니어야 합니다.
- 복합 키는 단일 열 정의 내부에 작성되는 것이 아니라 별도의 테이블 수준 PRIMARY KEY 절로 작성됩니다.
SQLite 외래 키 동작: 삭제 시 및 업데이트 시
외래 키는 참조하는 부모 행이 삭제되거나 업데이트될 때 자식 행에 어떤 일이 발생하는지 제어할 수도 있습니다. 이러한 참조 관련 작업은 외래 키를 정의할 때 ON DELETE 및 ON UPDATE 절을 사용하여 추가합니다. SQLite 다음 다섯 가지 활동을 지원합니다:
- 조치 없음 — 자식 행이 여전히 부모 행을 참조하는 경우 오류를 발생시키는 기본 동작입니다.
- 얽매다 — 다른 변경 사항이 실행되기 전에 삭제 또는 업데이트가 즉시 수행되는 것을 방지합니다.
- NULL 설정 — 자식 외래 키 열을 null로 설정합니다.
- 기본값으로 설정 — 자식 외래 키 열을 선언된 기본값으로 설정합니다.
- CASCADE — 자식 행에도 동일한 변경 사항이 적용되므로 부모 행을 삭제하면 자식 행도 함께 삭제됩니다.
아래 예시는 학과를 삭제하면 해당 학과의 학생 정보가 자동으로 삭제되고, 학과 ID를 업데이트하면 해당 학과의 학생 정보도 업데이트되도록 학생 테이블을 재구성합니다.
CREATE TABLE Students ( StudentId INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, StudentName NVARCHAR(50) NULL, DepartmentId INTEGER NOT NULL, FOREIGN KEY(DepartmentId) REFERENCES Departments(DepartmentId) ON DELETE CASCADE ON UPDATE CASCADE );
참조 작업은 외래 키 지원이 켜져 있을 때만 실행되므로, 모든 연결 시작 시 `PRAGMA foreign_keys = ON`을 실행해야 합니다. 그렇지 않으면, SQLite ON DELETE 및 ON UPDATE 절을 분석하지만, 해당 절을 강제 적용하지는 않습니다.


