2009-07-25 16 views
7

aşağıdaki tabloda bir göz edin:postgres: kısıtı çek ve boş değerler

name | x | y 
---------+-----+------ 
    foo | 3 | 5 
    bar | 45 | 99 
    foobar | 88 | 
    barfoo | 0 | 45 

Ben bir kısıtlama KONTROL (y> x) eklemek istiyorum, ama bu besbelli o tarafından ihlal edilmektedir nedeniyle başarısız olur satır 'foobar'.

Aşağıdakileri söyleyen bir kısıtlama nasıl oluştururum: (y> x), ancak yalnızca y boş değil mi?

cevap

11

, gerçekten başka bir şey yapmanıza gerek yoktur. Çek ifadesinin doğru veya null değerine ulaşması durumunda bir kontrol kısıtlaması sağlanır. o

2

Bir böyle Slayt ifadesinin içine NULL testi, IS koyabilirsiniz: (PostgreSQL 8.4 üzerinde test)

CREATE TABLE mytable (
    name TEXT, 
    x INTEGER, 
    y INTEGER CHECK (y IS NULL OR y > x) 
); 

Aslında

+3

Bu sadece gerekli değildir null değerlendirir beri satır filanca kısıtlamayı ihlal etmez çünkü senaryoda olduğu gibi

Sizin kısıt Slayt (y> x) çalışacak. PostgreSQL kılavuzundan alıntı: * Kontrol ifadesinin doğru veya null değerine göre değerlendirildiğinde bir kontrol sınırlaması sağlandığına dikkat edilmelidir. Çoğu ifade, herhangi bir işlenenin boş olması durumunda boş değere değerlendireceğinden, kısıtlı sütunlarda boş değerleri engellemez. * (Http://www.postgresql.org/docs/8.1/static/ddl-constraints.html) –