SQL: отрицательный автоинкремент? - PullRequest
0 голосов
/ 17 января 2011

Я хочу автоматически уменьшать значение available_seats в таблице FLIGHT при каждом добавлении новой записи строки в таблицу FLIGHT_PLAN

FLIGHT_PLAN определяется как:

FLIGHT_PLAN (plan_number NUMBER, flight_number NUMBER)

и FLIGHT определяется как

FLIGHT (flight_number NUMBER, available_seats NUMBER) 

Должен ли я сделать это с помощью хранимой процедуры, триггера?

Ответы [ 4 ]

5 голосов
/ 17 января 2011

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

  • Если вы это сделаете, посмотрите на триггеры.Возможно, вы захотите запустить при создании, обновлении и удалении таблицы FLIGHT_PLAN для настройки таблицы FLIGHT.

  • Если вам не нужна оптимизация или вы еще не уверены, что она требуетсяне оптимизировать.Вы можете составить быстрый запрос на количество выделенных мест и рассчитать требуемое значение оставшихся мест:

    ВЫБРАТЬ СЧЕТЧИК (*) ОТ FLIGHT_PLAN, где PLAN_NUMBER =?

    ВЫБРАТЬ всего_секций ОТ ПОЛЕТА;

    ...

    $ available_seats - $ total_seats - $ busy_seats;

3 голосов
/ 17 января 2011

Я бы обработал весь процесс в хранимой процедуре.Намного легче читать и управлять необходимой блокировкой (то есть гарантировать, что вы не получите отрицательных свободных мест, когда человек A добавляет план полета точно в то же время, что и человек B).

2 голосов
/ 17 января 2011

В связи с вашим другим вопросом здесь Я бы порекомендовал вам нормализовать данные.

FLIGHT_PLAN (plan_number NUMBER, flight_number NUMBER)
FLIGHT (flight_number NUMBER, model_id NUMBER) 
PLANE_MODEL(NUMBER model_id, NUMBER capacity)

Добавьте model_id в ПОЛЕТ, который даст вам возможность полета черезобъединениеЧтобы узнать, сколько мест доступно, вы можете использовать запрос:

SELECT F.flight_number, M.capacity, M.capacity - COALESCE((
    SELECT count(*) FROM FLIGHT_PLAN P
    WHERE P.flight_number = F.flight_number
    ), 0) as AvailableSeats
FROM FLIGHT F
INNER JOIN PLANE_MODEL M ON M.model_id=F.model_id
0 голосов
/ 18 января 2011

Я бы предпочел SQL-процесс, то есть увеличение и уменьшение (и, без сомнения, другие данные) в пределах одной транзакции.

С помощью триггера FLIGHT_PLAN вы можете решить его.И следующая проверка делает это вокруг:

Alter Table FLIGHT Add
  Constraint FLIGHT_AVAIL_SEATS_CHK
  Check (available_seats >= 0);
...