Как создать ограничение, позволяющее только максимальному количеству строк равняться некоторым данным

#sql #sql-server #check-constraints

Вопрос:

Я хочу создать базу данных, скажем, для авиакомпании, у которой есть максимальное количество рейсов, которые можно забронировать на каждый рейс.

Я создал эту таблицу:

 CREATE TABLE dbo.Airline (  FlightNum char(6),  PassengerFirstName varchar(30),  PassengerLastName varchar(30),  PassengerAddress varchar(50),  DateOfBirth date,  FlightDate date )  

Я хочу иметь CONSTRAINT систему, которая позволит бронировать только определенное количество рейсов на номер рейса на дату, поэтому, допустим, я хочу, чтобы в номере рейса AIR001 было не более 5 пассажиров, а в номере рейса AIR002 может быть не более 6 пассажиров каждый день.

Поэтому я попытался добавить это CONSTRAINT

 CONSTRAINT ck_Airline_flight_num_maximum_bookings_exceeded   CHECK(COUNT(FlightNum) lt; CASE FlightNum WHEN 'AIR001' THEN 5 WHEN 'AIR002' THEN 6 END)  

Но я получаю эту ошибку:

Агрегат может не отображаться в выражении вычисляемого столбца или ограничении проверки.

Что CONSTRAINT я могу использовать? И есть ли лучший способ сделать это, чем с CASE помощью заявления?

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

1. Если FlightNum предназначено для того, чтобы содержать a int , почему это a char ?

2. Это не int, как его «AIR001» и т. Д.

3. Сбит с толку логикой, которую вы пытаетесь применить здесь. Похоже, вам нужна таблица рейсов с maxqty или аналогичным значением, которую вы можете проверить, прежде чем вставлять строку и вызывать соответствующую ошибку.

4. Да, мне это нужно, чтобы проверить, не превышено ли максимальное количество пассажиров, разрешенных на рейс по этому номеру рейса на этот день, но сначала я попытался проверить только количество номеров рейса, и я получаю ошибку, поэтому мой вопрос в том, как мне сделать такое constraint

5. A CONSTRAINT проверяет правильность строки, и только этой строки. Вы не можете проверить значения других строк в a CONSTRAIT . Если вы должны обеспечить такое поведение, вам придется сделать это с помощью хорошо написанного триггера.

Ответ №1:

Используйте триггер вместо ограничения, так как вы не можете использовать агрегатные функции для ограничения.

 Create Trigger TriggerFlightNum   On Airline  AFTER INSERT   As  If ((Select COUNT(FlightNum) From Airline) gt; (SELECT TOP 1 CASE FlightNum WHEN 'AIR001' THEN 5 WHEN 'AIR002' THEN 6 END FROM Airline))  RollBack Transaction