2010-04-10 7 views
23

Tôi có một bảng được định nghĩa bởi SQL sau:Ràng buộc kiểm tra SQLite có điều kiện?

CREATE TABLE test (
    id  integer PRIMARY KEY NOT NULL UNIQUE, 
    status text NOT NULL, 
    enddate date, 
    /* Checks */ 
    CHECK (status IN ("Current", "Complete")) 
); 

Tôi muốn thêm một hạn chế đòi hỏi enddate là không null nếu các status là "Complete".

Điều này có khả thi không? Tôi đang sử dụng SQLite v3.6.16.

Trả lời

35

Làm thế nào về:

CHECK (status = "Current" or (status = "Complete" and enddate is not null)) 
+2

Cảm ơn, công trình này. đây có phải cách duy nhất không? Trong tương lai, tôi có thể có số lượng trạng thái lớn hơn và séc có thể phát triển khá lớn. – Rezzie

+4

Khi các ràng buộc trở nên rất phức tạp, cách tiếp cận thường là đặt một lớp ở phía trước của bảng để thực thi nó. Giống như một lớp thủ tục lưu trữ, hoặc một thư viện truy cập dữ liệu. – Andomar

+0

Cảm ơn lời khuyên. – Rezzie

5
CREATE TABLE test (
    id  integer PRIMARY KEY, 
    status text NOT NULL CHECK (status IN ('Current', 'Complete')), 
    enddate date NOT NULL 
); 

này sẽ làm việc trong SQLite, với CHECK chế bằng văn bản nội tuyến. Tôi đã thay đổi dấu ngoặc kép thành dấu nháy đơn để nó có thể được sử dụng trong PHP.

+0

Bạn đã đọc câu hỏi chưa? Anh ấy thậm chí còn đặt phần quan trọng trong ** đậm ** những gì bạn vừa mới loại bỏ. – TWiStErRob

0

Không có gì ngăn bạn có nhiều ràng buộc CHECK trên một bảng. IMO là giải pháp đơn giản nhất và dễ dàng mở rộng nhất:

CHECK (status IN ("Current", "Complete")) 
CHECK (status <> "Complete" OR enddate IS NOT NULL) 

này sử dụng thực tế là nếu A thì B là logic tương đương với hoặc không A hoặc B.