2013-08-09 4 views
8

ich eine Tabelle mit 4 Spalten (ID (PK, int, NOT NULL), col1 (NULL), col2 (NULL), col3 (NULL))Können sich CHECK-Einschränkungen wie sonst verhalten?

Id gerne eine CHECK-Einschränkung (auf Tabellenebene hinzufügen ich denke), so dass:

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

und wenn col3 NOT nULL ist dann col1 und col2 muss nULL sein

dh col3 sollte null sein, wenn col1 und col2 nicht null sind oder umgekehrt

Ich bin sehr neu in SQL und SQL Server obwohl ein Ich bin mir nicht sicher, wie ich das tatsächlich umsetzen soll oder ob es überhaupt umgesetzt werden kann/soll.

Ich denke, vielleicht:

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

Aber ich bin nicht sicher, ob die Klammern zu einer Gruppe wie diese die Logik verwendet werden können?

Wenn nicht, wie kann das am besten umgesetzt werden?

+0

Nein, meine Tabellen auf einem Live-Server mit vielen anderen sind Sachen, die Arbeit verwendet, also möchte ich nicht Dinge vermasseln: O – Toby

+2

Haben Sie keine äquivalente Entwicklungsumgebung? – Yuck

+0

Nein, habe auch keine Möglichkeit, hier einen zu setzen, sonst hätte ich so angefangen (auch wenn ich erwähnt habe, dass ich sehr neu bei SQL bin und nicht wüsste, wo ich den SQL-Server oder die Datenbank von Grund auf neu einrichten soll). – Toby

Antwort

11

Absolut können Sie dies tun. Siehe hierzu sqlfiddle.

Sie müssen jedoch sicherstellen, dass Sie Ihre Logik richtig eingrenzen. Sie sollten nie ANDs und ORs im gleichen Belichtungsumfang mischen. Also:

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

benötigt werden:

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

Oder:

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

auf Ihre Absicht Je.

+0

Danke - auch danke für das Zeigen sqfiddle, wusste nicht, dass es existiert, wird sehr praktisch sein :) – Toby

+0

aber wird es überprüfen, ob beide Bedingungen auch umgekehrt sind ?? – Dhaval

+0

@Dhaval: Sie wollen wahrscheinlich darauf hinweisen, dass die Logik einfach sein soll '((col1 NOT NULL UND col2 NOT NULL UND col3 NULL) ODER (col3 NOT NULL UND col1 NULL UND col2 NULL))'. Das Problem dabei ist, dass es immer erzwingt, dass "col1" und "col2" denselben Zustand haben. Ich denke, das OP hat das absichtlich nicht gemacht, weil 'col3' NULL sein sollte, wenn _one_ von' col1' oder 'col2' NICHT NULL ist. – PinnyM

3

Achten Sie darauf, dass Sie mit den Klammern keinen Fehler machen.

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

Ich würde sagen, ein UDF wie unten

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 

erstellen und anschließend folgende Prüfaussage in Ihrer Tabelle hinzufügen

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

Wow, das ist so weit über meinem Kopf ! Können Sie erklären, warum dies besser wäre als die einfache AND/OR-Einschränkung? – Toby

+1

@Toby .. du hast Recht ... Ich habe gerade versucht zu erklären, dass dies getan werden kann – Dhaval

Verwandte Themen