SQLite
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> SQLite

Cách kích hoạt hỗ trợ khóa ngoại trong SQLite

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:

  1. Bật khóa ngoại khi biên dịch SQLite.
  2. 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_KEYSQLITE_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           

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. cơ sở dữ liệu SQLite android với databse trên vị trí cụ thể có được không?

  2. SQLite JSON_REMOVE ()

  3. Hàng cập nhật Android SQLite không hoạt động

  4. NullPointerException trên getReadableDatabase ()

  5. Android - Cách tiếp cận tốt hơn trong việc tải hình ảnh thẻ SD CARD