SQLite bao gồm một câu lệnh PRAGMA cho phép bạn kiểm tra các vi phạm khóa ngoại trên toàn bộ cơ sở dữ liệu hoặc một bảng nhất định.
Câu lệnh là PRAGMA foreign_key_check
và nó hoạt động như sau.
Cú pháp
Bạn có thể sử dụng nó theo một trong hai cách:
PRAGMA schema.foreign_key_check;
PRAGMA schema.foreign_key_check(table-name);
Dòng đầu tiên kiểm tra toàn bộ cơ sở dữ liệu, trong khi dòng thứ hai chỉ kiểm tra một bảng cụ thể.
schema
tùy chọn đối số chỉ định tên của cơ sở dữ liệu đính kèm hoặc main hoặc tạm thời cho cơ sở dữ liệu chính và TEMP. If schema
bị bỏ qua, chính được giả định.
Ví dụ
Hãy tạo hai bảng có mối quan hệ giữa chúng.
Trong trường hợp này, Thú cưng bảng có khóa ngoại tham chiếu đến TypeId trên cột Loại bảng.
CREATE TABLE Types(
TypeId INTEGER PRIMARY KEY,
Type
);
CREATE TABLE Pets(
PetId INTEGER PRIMARY KEY,
PetName,
TypeId,
FOREIGN KEY(TypeId) REFERENCES Types(TypeId)
);
Bây giờ, hãy nhập dữ liệu vi phạm ràng buộc khóa ngoài.
PRAGMA foreign_keys = OFF;
INSERT INTO Types VALUES
( 1, 'Dog' ),
( 2, 'Cat' );
INSERT INTO Pets VALUES
( 1, 'Homer', 3 );
INSERT
thứ hai câu lệnh vi phạm ràng buộc khóa ngoại. Điều này là do nó chèn giá trị 3 vào Pets.TypeId khi không có giá trị tương ứng trong cột Loại.TypeId cột.
Một điều quan trọng cần lưu ý ở đây là tôi đã tắt khóa ngoại một cách rõ ràng bằng cách sử dụng PRAGMA foreign_keys = OFF
. Đây là cài đặt mặc định trong SQLite, nhưng tôi muốn làm rõ cho ví dụ này.
Bây giờ, hãy kiểm tra cơ sở dữ liệu xem có vi phạm khóa ngoại không.
PRAGMA foreign_key_check;
Kết quả:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0
Điều này cho chúng tôi biết rằng Thú cưng bảng có vi phạm khóa ngoại trên hàng có ROWID là 1. Nó cũng cho chúng tôi biết tên của bảng mẹ, cũng như ID khóa ngoại.
Hãy thêm nhiều dữ liệu hơn vào Thú cưng bảng và chạy kiểm tra lại. Hai dòng đầu tiên tuân theo khóa ngoại, nhưng dòng cuối cùng thì không.
INSERT INTO Pets VALUES
( NULL, 'Yelp', 1 ),
( NULL, 'Fluff', 2 ),
( NULL, 'Brush', 4 );
PRAGMA foreign_key_check;
Kết quả:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0 Pets 4 Types 0
Bây giờ chúng tôi có hai hàng được trả về khi kiểm tra toàn bộ cơ sở dữ liệu để tìm các vi phạm khóa ngoại.
Kiểm tra một bảng cụ thể
Bạn cũng có thể chỉ định một bảng để chạy kiểm tra.
Dưới đây là ví dụ về việc viết lại séc trước đó để chỉ định Vật nuôi bảng.
PRAGMA foreign_key_check(Pets);
Kết quả:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0 Pets 4 Types 0
Kết quả tương tự.
Đây là kết quả nếu tôi chỉ định bảng khác.
PRAGMA foreign_key_check(Types);
Kết quả:
(Ô trống vì không có kết quả.)
Chỉ định một giản đồ
Như đã đề cập, bạn cũng có thể chỉ định lược đồ.
PRAGMA main.foreign_key_check(Pets);
Kết quả:
table rowid parent fkid ---------- ---------- ---------- ---------- Pets 1 Types 0 Pets 4 Types 0
Trong trường hợp của tôi, tôi đã sử dụng cơ sở dữ liệu chính, nhưng bạn có thể thay thế main
với tên của cơ sở dữ liệu đính kèm của bạn.
Cách sử dụng khóa nước ngoài
Như đã đề cập, SQLite không thực thi khóa ngoại trừ khi bạn chỉ định rõ ràng rằng chúng phải được thực thi.
Bạn có thể thực thi khóa ngoại bằng cách sử dụng PRAGMA foreign_keys = ON
.
Xem Cách bật hỗ trợ khóa ngoại trong SQLite để biết thêm thông tin và ví dụ.