powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как вычислять поля?
4 сообщений из 4, страница 1 из 1
Как вычислять поля?
    #32561188
BigallS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Firebird 1.5
Имеется таблица:

CREATE TABLE PEOPLE (
ID_P INTEGER NOT NULL,
ID_EXTP INTEGER,
...
CATEGORY VARCHAR(30),
N_PRIV INTEGER,
...
);
Поле ID_P - заполняется генератором,
поле ID_EXTP - номер очереди,
поле CATEGORY - вид льготы,
поле N_PRIV - номер льготной очереди.

Необходимо:

1) При вставке новой записи, поле ID_EXTP необходимо увеличивать
на 1, при удалении записи пересчитывать порядок нумерации поля
(например если есть 100 записей и удалена 45-я пересчитать
значение поля ID_EXTP от 1 до 99).
2) При вставке новой записи и НАЛИЧИИ записи в поле CATEGORY,
поле N_PRIV изменять также как и поле ID_EXTP (при вставке
увеличивать на 1, при удалении пересчитывать).

Теперь вопросы:
1. Как лучше сделать, использовать триггеры на INSERT,DELETE
или использовать процедуры?
2. Вычислять значения полей в клиентском приложении?
3. Как лучше вычислять максимальное значение полей ID_EXTP,N_PRIV
(Select max(ID_EXTP) from people, а потом прибавлять 1 ???),
а при работе 2 пользователей какие могут быть проблемы?
...
Рейтинг: 0 / 0
Как вычислять поля?
    #32561389
Gold
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор1. Как лучше сделать, использовать триггеры на INSERT,DELETE
или использовать процедуры?

Я бы процедурой сделал наверрное, т.к. в триггерах надо будет делать защиту от зацикливания ещё.

автор2. Вычислять значения полей в клиентском приложении?

Думаю не стоит

автор3. Как лучше вычислять максимальное значение полей ID_EXTP,N_PRIV
(Select max(ID_EXTP) from people, а потом прибавлять 1 ???),
а при работе 2 пользователей какие могут быть проблемы?

В том то и дело что проблемы могут быть - поэтому в IB есть генераторы. А так тебе прийдётся блокировать всю таблицу и мириться с dedlock-ами всякими чтобы если вставляется запись, то другим фиг. По идее это лучше всего делать через специальную процедуру или представление в короткой транзакции. Почитай это
...
Рейтинг: 0 / 0
Как вычислять поля?
    #32562648
BigallS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Статью почитал.
Да, склоняюсь больше к использованию процедур.
FIB компоненты у меня есть, буду в короткой транзакции
записывать данные, благо в FIB-ах к этому есть все возможности.
Вот только получение максимального номера
(Select max(ID_EXTP) from people) меня смущает.
И еще вопрос по вычислению полей, вернее по алгоритму
их обновления при удалении записи(записей), если запись
удалена, каким образом лучше пересчитывать поля?
При удалении, по ключевому полю посчитать сколько осталось
записей и заново перенумеровать их? Или пересчитывать только
те записи которые находятся после удаляемой?
Если пересчитывать заново то на большом наборе данных будет
медленно, пересчитывать записи после удаляемой - тогда как
быть если удалены несколько записей не подряд, а в разных
местах таблицы?
...
Рейтинг: 0 / 0
Как вычислять поля?
    #32562911
Лентяй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BigallS
Необходимо:
1) При вставке новой записи, поле ID_EXTP необходимо увеличивать
на 1, при удалении записи пересчитывать порядок нумерации поля
(например если есть 100 записей и удалена 45-я пересчитать
значение поля ID_EXTP от 1 до 99).
2) При вставке новой записи и НАЛИЧИИ записи в поле CATEGORY,
поле N_PRIV изменять также как и поле ID_EXTP (при вставке
увеличивать на 1, при удалении пересчитывать).


ИМХО для многопользовательского режима задача не имеет решения.

Удачи.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Как вычислять поля?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]