Khóa chính và khóa ngoại trong SQLite với các ví dụ

SQLite Những ràng buộc

Các ràng buộc cột thực thi các ràng buộc và quy tắc đối với các giá trị được chèn trên một cột để xác thực dữ liệu được chèn. Các ràng buộc về cột được xác định khi tạo bảng, trong định nghĩa cột.

SQLite Khóa chính

Tất cả các giá trị trên cột khóa chính phải là duy nhất và không rỗng

Khóa chính chỉ có thể được áp dụng cho một cột hoặc trên tổ hợp các cột, trong trường hợp sau, tổ hợp giá trị của các cột phải là duy nhất cho tất cả các hàng của bảng.

Cú pháp:

Có rất nhiều cách khác nhau để xác định khóa chính trên bảng như:

  • Trong chính định nghĩa cột:
    ColumnName INTEGER NOT NULL PRIMARY KEY;
  • Là một định nghĩa riêng:
    PRIMARY KEY(ColumnName);
  • Để tạo tổ hợp các cột làm khóa chính:
    PRIMARY KEY(ColumnName1, ColumnName2);

Ràng buộc không có giá trị rỗng

SQLite Ràng buộc không null ngăn không cho cột có giá trị null:

ColumnName INTEGER  NOT NULL;

Ràng buộc MẶC ĐỊNH

SQLite Ràng buộc mặc định nếu bạn không chèn bất kỳ giá trị nào vào cột thì giá trị mặc định sẽ được chèn thay thế.

Ví dụ:

ColumnName INTEGER DEFAULT 0;

Nếu bạn viết một câu lệnh chèn và bạn không chỉ định bất kỳ giá trị nào cho cột đó thì cột đó sẽ có giá trị 0.

SQLite Hạn chế duy nhất

SQLite Ràng buộc duy nhất sẽ ngăn chặn các giá trị trùng lặp trong số tất cả các giá trị của cột.

Ví dụ:

EmployeeId INTEGER NOT NULL UNIQUE;

Điều này sẽ thực thi các "Mã hiệu công nhân" giá trị là duy nhất, không cho phép giá trị trùng lặp. Lưu ý rằng, điều này áp dụng trên các giá trị của cột "Mã hiệu công nhân" chỉ

SQLite KIỂM TRA ràng buộc

SQLite kiểm tra ràng buộc một điều kiện để kiểm tra giá trị được chèn, nếu giá trị không khớp với điều kiện thì giá trị đó sẽ không được chèn.

Quantity INTEGER NOT NULL CHECK(Quantity > 10);

Bạn không thể chèn giá trị nhỏ hơn 10 vào "Định lượng" cột.

SQLite chính nước ngoài

SQLite Khóa ngoại là một ràng buộc xác minh sự tồn tại của giá trị có trong bảng này sang bảng khác có mối quan hệ với bảng đầu tiên nơi khóa ngoại được xác định.

Khi làm việc với nhiều bảng, khi có hai bảng liên quan với nhau bằng một cột chung. Và nếu bạn muốn đảm bảo rằng giá trị được chèn vào một trong số chúng phải tồn tại trong cột của bảng kia thì bạn nên sử dụng “Ràng buộc khóa ngoại” trên cột chung.

Trong trường hợp này, khi bạn cố gắng chèn một giá trị vào cột đó thì khóa ngoại sẽ đảm bảo rằng giá trị được chèn tồn tại trong cột của bảng.

Lưu ý rằng các ràng buộc khóa ngoại không được bật theo mặc định trong SQLite, trước tiên bạn phải kích hoạt chúng bằng cách chạy lệnh sau:

PRAGMA foreign_keys = ON;

Ràng buộc khóa ngoại được đưa vào SQLite bắt đầu từ phiên bản 3.6.19.

Ví dụ về SQLite chính nước ngoài

Giả sử chúng ta có hai bảng; Sinh viên và các khoa.

Bảng Sinh viên có danh sách sinh viên và bảng khoa có danh sách các khoa. Mỗi sinh viên thuộc một khoa; tức là mỗi học sinh có một cột DepartmentId.

Bây giờ, chúng ta sẽ xem ràng buộc khóa ngoại có thể hữu ích như thế nào trong việc đảm bảo rằng giá trị của id phòng ban trong bảng sinh viên phải tồn tại trong bảng phòng ban.

SQLite chính nước ngoài

Vì vậy, nếu chúng ta tạo một ràng buộc khóa ngoại trên DepartmentId trên bảng Sinh viên, thì mỗi DepartmentId được chèn vào phải xuất hiện trong bảng 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)
);

Để kiểm tra xem ràng buộc khóa ngoại có thể ngăn chặn việc chèn phần tử hoặc giá trị chưa xác định vào bảng có quan hệ với bảng khác như thế nào, chúng ta sẽ xem xét ví dụ sau.

Trong ví dụ này, bảng Phòng ban có ràng buộc khóa ngoại đối với bảng Sinh viên, do đó, bất kỳ giá trị DepartmentId nào được chèn vào bảng sinh viên đều phải tồn tại trong bảng phòng ban. Nếu bạn cố gắng chèn một giá trị DepartmentId không tồn tại trong bảng phòng ban, ràng buộc khóa ngoại sẽ ngăn cản bạn làm điều đó.

Hãy chèn hai phòng ban "NÓ""Nghệ thuật" vào bảng các phòng ban như sau:

INSERT INTO Departments VALUES(1, 'IT');
INSERT INTO Departments VALUES(2, 'Arts');

Hai câu lệnh sẽ chèn hai phòng ban vào bảng phòng ban, bạn có thể đảm bảo rằng hai giá trị đã được chèn bằng cách chạy truy vấn “CHỌN * TỪ các phòng ban” sau đó:

SQLite chính nước ngoài

Sau đó thử chèn một sinh viên mới với ID khoa không tồn tại trong bảng của khoa:

INSERT INTO Students(StudentName,DepartmentId) VALUES('John', 5);

Hàng sẽ không được chèn và bạn sẽ gặp lỗi khi nói rằng: Ràng buộc FOREIGN KEY không thành công.

Tóm tắt bài viết này với: