Оба столбца не могут иметь значения null одновременно, только по одному за раз, как определить это ограничение?

#sql #sql-server

#sql #sql-сервер

Вопрос:

У меня есть таблица:

 create table tblFeedbacks
(
        Id int not null Primary key identity,
        ClientFeedback bit null,
        BarberFeedback bit null,
        BarberId int not null foreign key references tblBarberInfo(Id),
        ClientId int not null foreign key references tblClients(Id),
        Feedback nvarchar(max) not null
)
  

Если отзывы клиентов больше 1, в противном случае отзывы парикмахеров 1, как установить ограничение для этой ситуации?

  • Бит обратной связи с клиентом null,
  • Бит обратной связи Barber null,

Извините за английский

Комментарии:

1. Или я должен использовать триггер для вставки в эту таблицу?

Ответ №1:

Вы используете check ограничение. Например, если вы хотите, чтобы ровно одно значение было 1 :

 create table tblFeedbacks(
        Id int not null Primary key identity,
        ClientFeedback bit null,
        BarberFeedback bit null,
        BarberId int not null foreign key references tblBarberInfo(Id),
        ClientId int not null foreign key references tblClients(Id),
        Feedback nvarchar(max) not null),
        check ( (ClientFeedback = 1 and BarberFeedback = 0) or (ClientFeedback = 0 and BarberFeedback = 1) )
);
  

Я предполагаю, что это может быть то, что вы хотите. Но ваш вопрос конкретно о NULL значениях. Это ограничение будет:

         check ( ClientFeedback is not null or BarberFeedback is not null )
  

Комментарии:

1. Это не касается значений NULL.

2. @dnoeth . . . Я, должно быть, неправильно истолковал вопрос так, как подходит для OP — что должен быть только один из столбцов 1 . Я обновил ответ.

3. Ограничение должно быть check ( not (ClientFeedback is not null and BarberFeedback is not null ))

Ответ №2:

Используйте только один FeedBackType столбец, объявленный как NOT NULL , где вы могли бы установить значение B для Barber или C для Client (и, возможно, check ограничение, ограничивающее эти значения, как показано в другом ответе). Или, если вы хотите пофантазировать, пусть это будет внешний ключ обратно к FeedBackTypes таблице.