SqlServer ограничивает значение поля, зависящее от другого значения поля - PullRequest
1 голос
/ 15 сентября 2010

Как заголовок вопроса, есть ли способ сделать это?

например:

DrivingLicence
--------------- 
CanDriveCar       (bool) 
CanDriveMotorbike (bool) 
CanDriveBus       (bool)

Вы не можете водить автобус без автомобильной лицензии, поэтому я хочу, чтобы БД выдавала исключение, если кто-то пытается дать кому-то автобусную лицензию, если у него нет автомобильной лицензии.

Ответы [ 2 ]

2 голосов
/ 15 сентября 2010
ALTER TABLE dbo.DrivingLicence ADD CONSTRAINT
    NameOfConstraint CHECK (CanDriveBus=0 OR CanDriveCar=1)
1 голос
/ 15 сентября 2010

Мартин дал вам возможный ответ, но из вашего поста неясно, какова ваша модель данных: автомобильная лицензия и автобусная лицензия имеют один и тот же номер лицензии или нет? Иными словами, если у меня есть автомобильная лицензия и я учусь водить автобус, я получу вторую лицензию или просто штамп на моей существующей лицензии?

Если это отдельные лицензии, то я предполагаю, что они будут отдельными строками в вашей таблице, потому что первичный ключ таблицы - надеюсь! - Номер лицензии. И в этом случае ограничения CHECK не будут работать, потому что они применяются только к значениям в одной строке; вам нужно будет использовать триггеры, чтобы проверить, какие лицензии уже есть у драйвера при добавлении нового.

Так что ваши варианты:

  1. Водители могут иметь только одну лицензию с одним уникальным номером: используйте ограничение CHECK
  2. Драйверы могут иметь несколько лицензий разных типов с разными номерами: используйте триггер
  3. Это сложнее: использовать сохраненный код процесса или приложения для вставки новых лицензий

Ваш пост предлагает 1, но немного неясно. И даже если это так, вы можете рассмотреть вторую таблицу под названием DrivingLicenceQualifications или любую другую: если одна лицензия может иметь много квалификаций, и если вы планируете добавлять новые квалификации в будущем, тогда это будет более гибким.

И, к вашему сведению, в MSSQL нет логического типа данных, возможно, вы имели в виду BIT?

...