#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
предназначено для того, чтобы содержать aint
, почему это achar
?2. Это не int, как его «AIR001» и т. Д.
3. Сбит с толку логикой, которую вы пытаетесь применить здесь. Похоже, вам нужна таблица рейсов с
maxqty
или аналогичным значением, которую вы можете проверить, прежде чем вставлять строку и вызывать соответствующую ошибку.4. Да, мне это нужно, чтобы проверить, не превышено ли максимальное количество пассажиров, разрешенных на рейс по этому номеру рейса на этот день, но сначала я попытался проверить только количество номеров рейса, и я получаю ошибку, поэтому мой вопрос в том, как мне сделать такое
constraint
5. A
CONSTRAINT
проверяет правильность строки, и только этой строки. Вы не можете проверить значения других строк в aCONSTRAIT
. Если вы должны обеспечить такое поведение, вам придется сделать это с помощью хорошо написанного триггера.
Ответ №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