2013-08-09 18 views
8

Ben 4 sütununa (ID (PK, int, NOT NULL), col1 (NULL), col2 (NULL), col3 (NULL))Can CHECK kısıtlamaları gibi davranabilir mi?

Kimliği bir CHECK kısıtlaması eklemek ister içeren bir tablo var (tablo düzey ? sanırım) böylece:

if col1 OR col2 are NOT NULL then col3 must be NULL 

ve col3 sonra col1 nOT NULL ise vE col2 NULL olmalıdır

yani col3 col1 ve col2 tersi

boş değilse veya eğer null olmalıdır

SQL ve SQL sunucusuna rağmen çok yeni Bunu gerçekten nasıl uygulayacağından ve hatta uygulanabilmesinden/uygulanmasından nasıl emin değilim?

CHECK ((col1 NOT NULL OR col2 NOT NULL AND col3 NULL) OR 
     (col3 NOT NULL AND col1 NULL AND col2 NULL)) 

Fakat parantez böyle grubuna mantığı kullanılıp kullanılamayacağını emin değilim:

belki düşünüyorsun?

Değilse, bu nasıl en iyi şekilde uygulanabilir?

+0

Hayır, tablolar diğer birçok canlı sunucusunda bulunan tabloda aşağıdaki onay deyimi ekleyin söyleyebilirim işe yarayan şeyler, bu yüzden ben şeyleri vidalamak istemiyorum: O – Toby

+2

Eşdeğer bir geliştirme ortamınız yok mu? – Yuck

+0

Hayır, burada bir tane kurmak için bir yol yok, başka bir şekilde nasıl başlayacağımı (ayrıca SQL'de çok yeni bir şeyden bahsettim ve SQL sunucusunu veya DB'yi sıfırdan başlatmaya nereden başlayacağımı bilmiyorum) – Toby

cevap

11

Kesinlikle bunu yapabilirsiniz. Bkz. sqlfiddle. Bununla birlikte, mantığınızı doğru şekilde bağladığınızdan emin olmanız gerekir. Aynı parantez içinde asla AND'leri ve OR'leri karıştırmalısınız. Yani:

(col1 NOT NULL OR col2 NOT NULL AND col3 NULL) 

olmayı İhtiyaçları:

((col1 NOT NULL OR col2 NOT NULL) AND col3 NULL) 

Veya:

(col1 NOT NULL OR (col2 NOT NULL AND col3 NULL)) 

senin niyet bağlı.

+0

Teşekkürler - ayrıca sqfiddle gösterme için teşekkürler, var olduğunu bilmiyordum, çok kullanışlı olacak :) – Toby

+0

Her iki durum için de viceversa anlamına gelir mi? – Dhaval

+0

@Dhaval: Muhtemelen mantığın basitçe '' ((col1 NOT NULL AND col2 NOT NULL AND col3 NULL) VEYA (col3 NOT NULL AND col1 NULL AND col2 NULL)) olması gerektiğini belirtmek istersiniz. Bununla ilgili sorun, her zaman 'col1' ve 'col2' nin aynı duruma sahip olmasını zorunlu kılmasıdır. OP'nin bilerek bunu yapmadığını düşünüyorum çünkü 'col1' ya da 'col2' _ON_NULL DEĞİL ise 'col3' NULL olmalıdır. – PinnyM

3

Köşeli ayraçlarla hata yapmamaya dikkat edin.

CREATE TABLE Test1 (col1 INT, col2 INT, col3 INT); 


ALTER TABLE Test1 
ADD CONSTRAINT CHK1 
CHECK (((col1 IS NOT NULL OR col2 IS NOT NULL) AND col3 IS NULL) OR 
     ((col1 IS NULL AND col2 IS NULL) AND col3 IS NOT NULL)) 



INSERT INTO Test1 VALUES (1,1,1); --fail 
INSERT INTO Test1 VALUES (1,1,NULL); --good 
INSERT INTO Test1 VALUES (1,NULL,NULL); --good 
INSERT INTO Test1 VALUES (1,NULL,1); --fail 
INSERT INTO Test1 VALUES (NULL,NULL,1); --good 
1

Ben

altına
create FUNCTION dbo.fn_check_val 
    (@col1 int , @col2 int , @col3 int) 
RETURNS bit 
AS 
BEGIN 
    declare @toRet bit 
    IF(@col1 is Not null OR @col2 is NOT NULL) 
    Begin 
     if(@col3 is null) 
     Begin 
      Set @toRet = 1 
     End 
     Else 
     Begin 
      Set @toRet = 0 
     End 
    End 
    Else 
    if(@col3 is not null) 
    Begin 
     Set @toRet = 1 
    End 
    Else 
    Begin 
     Set @toRet = 0 
    End 
return @toRet 
END 

gibi bir UDF oluşturmak ve sonra

([dbo].[fn_check_val]([col1],[col2],[col3])=(1)) 
+0

Wow, bu benim kafamın çok uzağında. ! Bunu yapmanın neden basit AND/OR kısıtlamasından daha iyi olacağını açıklayabilir misiniz? – Toby

+1

@Toby .. haklısın ... Sadece bunu açıklamaya çalıştım – Dhaval

İlgili konular