Trong SQLite, các ràng buộc khóa ngoại không được thực thi trừ khi hỗ trợ khóa ngoại đã được bật.
Việc kích hoạt khóa ngoại liên quan đến những điều sau:
- Bật khóa ngoại khi biên dịch SQLite.
- Bật khóa ngoại trong thời gian chạy.
Bật khóa ngoại khi biên dịch SQLite
Khi nói đến việc biên dịch SQLite, vấn đề không phải là kích hoạt khóa ngoại - vấn đề quan trọng hơn là không vô hiệu hóa họ.
Bật khóa ngoại khi biên dịch SQLite đơn giản có nghĩa là bạn không sử dụng SQLITE_OMIT_FOREIGN_KEY
và SQLITE_OMIT_TRIGGER
khi biên dịch nó.
Nếu SQLITE_OMIT_TRIGGER
được xác định nhưng SQLITE_OMIT_FOREIGN_KEY
không, khi đó các định nghĩa khóa ngoại được phân tích cú pháp và có thể được truy vấn bằng cách sử dụng PRAGMA foreign_key_list
, nhưng các ràng buộc khóa ngoại không được thực thi. PRAGMA foreign_keys
lệnh cấm trong cấu hình này.
Nếu OMIT_FOREIGN_KEY
được xác định, thì định nghĩa khóa ngoại thậm chí không thể được phân tích cú pháp (việc cố gắng xác định định nghĩa khóa ngoại là một lỗi cú pháp).
Bật khóa ngoại khi chạy
Ngay cả khi thư viện đã được biên dịch với các ràng buộc khóa ngoại được bật, bạn vẫn cần bật hỗ trợ khóa ngoại trong thời gian chạy.
Bạn có thể thực hiện việc này bằng mã sau:
PRAGMA foreign_keys = ON;
Như với hầu hết PRAGMA
, bạn có thể thay thế ON
bằng cách khác với TRUE
, YES
hoặc 1
.
Sau khi bạn chạy điều đó, các khóa ngoại của bạn sẽ được thực thi.
Lưu ý rằng cài đặt này không bắt buộc để tạo khóa ngoại, nhưng nó được yêu cầu để thực thi khóa ngoại.
Các kết nối khác
Lưu ý rằng điều này chỉ bật các ràng buộc khóa ngoại cho kết nối cơ sở dữ liệu hiện tại.
Nếu bạn mở một kết nối mới, bạn sẽ cần chạy lại câu lệnh đó nếu bạn muốn các khóa ngoại được thực thi trong kết nối đó.
Kiểm tra Hỗ trợ Khóa Ngoại cho Kết nối Hiện tại
Bạn cũng có thể kiểm tra xem khóa ngoại đã được bật cho kết nối hiện tại của mình hay chưa bằng cách chạy mã sau.
PRAGMA foreign_keys;
Kết quả:
1
Trong trường hợp của tôi, tôi đã bật khóa ngoại cho kết nối này nên kết quả là 1. Nếu khóa ngoại bị tắt, kết quả sẽ là 0.
Dưới đây là một ví dụ về cách tắt, kiểm tra giá trị, sau đó bật và kiểm tra lại giá trị.
PRAGMA foreign_keys = FALSE;
PRAGMA foreign_keys;
PRAGMA foreign_keys = YES;
PRAGMA foreign_keys;
Kết quả:
sqlite> PRAGMA foreign_keys = FALSE; sqlite> PRAGMA foreign_keys; foreign_keys ------------ 0 sqlite> PRAGMA foreign_keys = YES; sqlite> PRAGMA foreign_keys; foreign_keys ------------ 1