2009-12-02 12 views
10

Witze mit einem Kollegen zu definieren, kam ich mit einem interessanten Szenario: Ist es in SQL Server möglich, eine Tabelle zu definieren, so dass durch "Standard bedeutet" (Einschränkungen, etc.) sicherstellen, dass zwei oder mehr Spalten sich gegenseitig ausschließen?SQL-Server: Spalten als sich gegenseitig ausschließende

Damit meine ich: Kann ich sicherstellen, dass nur eine der Spalten einen Wert enthält?

+0

Welches Problem versuchen Sie zu lösen? Subnormale Datenbanken sind ein PITA, mit dem man arbeiten kann, vielleicht kann man es so machen, dass die relationalen Goodies nicht geopfert werden. –

+0

Nun, es gibt kein wirkliches Problem hinter dieser Idee. Ich wollte nur wissen, ob das technisch möglich ist. Eine Idee könnte die Anforderung sein, dass ein Benutzer entweder seinen eigenen Namen oder den Firmennamen eingeben kann, aber nicht beides. Ich denke, ich denke, dass ich mir etwas besseres ausdenken könnte :-) –

Antwort

14

Ja, Sie können eine CHECK-Einschränkung verwenden:

ALTER TABLE YourTable 
ADD CONSTRAINT ConstraintName CHECK (col1 is null or col2 is null) 

Per Ihren Kommentar, wenn viele Spalten exklusiv sind, können Sie sie wie folgt überprüfen:

case when col1 is null then 0 else 1 end + 
case when col2 is null then 0 else 1 end + 
case when col3 is null then 0 else 1 end + 
case when col4 is null then 0 else 1 end 
= 1 

Diese besagt, dass eine der Vier Spalten müssen einen Wert enthalten. Wenn sie alle NULL sein können, überprüfen Sie einfach <= 1.

+0

Ah ja, ich kann sehen, wohin das geht. Allerdings wäre die Prüfung viel komplexer, wenn ich drei oder mehr Spalten hätte, da ich jede mögliche Kombination hinzufügen müsste, oder? –

+0

@Thorsten Dittmar: Es wird ein bisschen komplexer mit mehreren Spalten, ich denke, Sie können es tun, ohne jede mögliche Kombination hinzufügen, beantworten Sie bearbeitet – Andomar

+0

Hallo Anforderung entspricht genau die gleiche Situation oben beschrieben, aber zusätzlich möchte ich col1 und col2 beide nicht gleichzeitig null sein, nur einer von ihnen muss immer bevölkert sein. Wie kann ich das sicherstellen? – MaxRecursion

Verwandte Themen