2010-04-10 16 views
23

Aşağıdaki SQL tarafından tanımlanmış bir tablom var:Koşullu SQLite kontrol kısıtlaması?

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

enddatestatus'nin "Complete" olması durumunda enddate öğesinin boş olmayan olmasını gerektiren bir kısıtlama eklemek istiyorum.

Bu mümkün mü? SQLite v3.6.16 kullanıyorum.

cevap

35

. Ben çift tırnakları apostrophes değiştirdim, bu yüzden PHP'de kullanılabilir.

+2

Teşekkürler, bu çalışır. Tek yolu bu mu? Gelecekte daha fazla sayıda durum olabilir ve kontrol oldukça büyüyebilir. – Rezzie

+4

Kısıtlamalar çok karmaşık olduğunda, yaklaşım genellikle uygulamak için tablonun önüne bir katman koymaktır. Saklı yordam katmanı veya veri erişim kitaplığı gibi. – Andomar

+0

Tavsiye için teşekkürler. – Rezzie

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

Bu CHECK kısıtlaması yazılı satır içi ile, SQLite'ta çalışacaktır: nereden

+0

Soruyu okudun mu? Hatta önemli olanı ** bold ** 'da attı. – TWiStErRob

0

Tek bir tabloda birden çok CHECK kısıtlaması bulundurmanızı engelleyen hiçbir şey yok. IMO en basit ve en kolay bir şekilde genişletilebilir çözeltisi:

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

Bu bir o zaman B mantıksal olmayan ya A ya da B eşdeğer olduğu gerçeğini kullanır.