2010-06-11 29 views
8

Tại sao ràng buộc khoá ngoài sau đây (mặc dù thực thi tốt) không được thi hành bởi SQLite? Làm thế nào tôi có thể đi về thực thi mối quan hệ?Khóa ngoài không được thực thi

CREATE TABLE User (
    UserID TEXT Unique NOT NULL PRIMARY KEY, 
    FirstName TEXT NOT NULL, 
    LastName TEXT NOT NULL, 
    Username TEXT NOT NULL, 
    Password TEXT NOT NULL, 
    Email TEXT NOT NULL, 
    SignupDate TEXT NOT NULL 
) 

CREATE TABLE Category (
    CategoryID TEXT Unique NOT NULL PRIMARY KEY, 
    UserID TEXT, 
    FOREIGN KEY(UserID) REFERENCES User(UserID) 
) 

Trả lời

12

Như the relevant docs nói (trong phần 2. Cho phép hỗ trợ chính nước ngoài):

Assuming the library is compiled with foreign key constraints enabled, it must still be enabled by the application at runtime, using the PRAGMA foreign_keys command. For example:

sqlite> PRAGMA foreign_keys = ON;

Foreign key constraints are disabled by default (for backwards compatibility), so must be enabled separately for each database connection separately.

Bạn đã sử dụng mà PRAGMA trong kết nối có liên quan? (Giả sử, như các tài liệu nói, rằng sqlite được biên dịch một cách thích hợp, và cũng là một phiên bản đủ gần đây để cung cấp thực thi ràng buộc khóa ngoại, tất nhiên).

+0

Cảm ơn bạn rất nhiều vì đã phản ứng kịp thời. Tôi không bao giờ nhận thấy rằng trong tài liệu (sẽ trông khó khăn hơn thời gian tiếp theo). Chỉ cần cố chạy lệnh đó tôi nhận được lỗi sau: "Chuẩn bị SQLite() không thành công. LRI: ủy quyền bị từ chối DETAILS: không được phép EXPRESSION: PRAGMA foreign_keys = ON;" Tôi giả định rằng phiên bản mà họ đang sử dụng không hỗ trợ hoặc đã tắt chức năng này. Tôi có thể tạo kết quả cuối cùng bằng cách sử dụng trình kích hoạt không? Nếu có thể, vui lòng cung cấp một số cú pháp kích hoạt ví dụ cho SQLITE? –

+0

@Maxim, tôi tin rằng các trình kích hoạt khóa ngoài của sqlite yêu cầu chính xác chức năng cơ bản giống như các khóa ngoại thường cũ (thường bị loại bỏ trong các bản dựng sqlite được nhúng mà muốn nhỏ và nhanh hơn chúng muốn cung cấp "năng lượng ACID quan hệ đầy đủ" tại hiệu suất đáng kể và chi phí dấu chân). –

3

Bạn cũng có thể bật hỗ trợ chính nước ngoài qua nhúng trong ConnectionString:

foreign keys=True 

Ví dụ:

"Data Source={DatabaseFullFilePath};Version=3;foreign keys=True;datetimeformat=CurrentCulture" 
Các vấn đề liên quan