it-swarm.com.de

Erstellen Sie eine Einschränkung, sodass nur eines von zwei Feldern ausgefüllt werden muss

Ich habe eine Tabelle in SQL Server, in der die Benutzer Daten in einer von zwei Spalten eingeben müssen. Das heißt, einer der beiden muss Daten eingegeben haben, aber gleichzeitig möchte ich nicht zulassen, dass Benutzer in beide Spalten eingeben. Es ist entweder oder aber eines ist ein Muss.

9
Kevin

Sie müssen eine Prüfbedingung verwenden:

create table kevin
(
  one   integer, 
  other integer,
  constraint only_one_value 
        check (        (one is null or other is null) 
               and not (one is null and other is null) )
);

Dies stellt sicher, dass mindestens eine der Spalten einen Wert hat und nicht beide einen Wert haben.

Wenn dies varchar Spalten sind, möchten Sie möglicherweise auch nach leeren Werten ('') Suchen. Verwenden Sie dazu nullif(), das einen Wert in null konvertiert, wenn er dem zweiten Argument der Funktion entspricht.

create table kevin
(
  one   integer, 
  other integer,
  constraint only_one_value 
        check (        (nullif(one,'') is null or nullif(other,'') is null) 
               and not (nullif(one,'') is null and nullif(other,'') is null) )
);
12

Smth so?

create table #t (col1 int, col2 int)
go

alter table #t with check add 
   constraint ck_only_one check ((col1 is null and col2 is not null) or (col2 is null and col1 is not null)); 
2
sepupic

Ein Ansatz, der besser auf mehr als 2 Spalten skaliert werden kann, besteht darin, zu überprüfen, ob die Anzahl der Nicht-Null-Spalten 1 beträgt.

create table #t (col1 int, col2 int, col3 int)
go

alter table #t with check add constraint ck_only_one check (
    1 = 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
)
1
John Rees