Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как лучше всего автонумеровать добавляемые записи? [D5, Oracle]


Максимка ©   (2002-01-28 21:35:00) 

Есть варианты:
1. При добавлении записи находить запись с максимальным номером, прибавлять единицу. Недостаток: при пустой таблице - ошибка. Ещё вот мне подсказывают, что могут быть неприятности, если 2 юзера одновременно добавляют записи.
2. Создать последовательность и черпать номера из неё. Всё вроде бы нормально, но чем-то мне этот способ не нравится :((

Как это вообще люди делают по-человечески?


Дядя Будда   (2002-01-30 13:41:00) [1]

Наиболее надежный вариант на мой взгляд: создать Sequence и повесить на таблицу тригер типа такого:

create or replace trigger bi_MyTable
BEFORE INSERT ON MyTable
FOR EACH ROW

DECLARE iNewID INTEGER;
NumRows INTEGER;
BEGIN
IF (:new.iID = 0) THEN
LOOP
SELECT sqMySequence.nextval INTO iNewID FROM dual;
SELECT Count(*) INTO NumRows FROM MyTable WHERE iID = iNewId;
:new.iID:= iNewId;
EXIT WHEN NumRows = 0;
END LOOP;
END IF;
END;


Shirson   (2002-01-30 09:27:00) [2]

Хм... в MSSQL, поле которое будет счетчиком, отмечается как identity и.. и все. Номер автоинкременнтируется и является уникальным.


petr_v_a   (2002-01-29 11:18:00) [3]

если номера не обязаны идти сторого подряд и без "дырок", тогда, конечно, sequence. В противном случае лучше завести табличку из одной записи с последним номером и получать его
update T_LAST_NUM
set LAST_NUM=LAST_NUM+1
returning LAST_NUM into lnum -- переменная lnum объявлена ранее в триггере/процедуре.
при большой и "горячей" таблице, которую автонумеруют, этот вариант съест меньше всего процессора/памяти и сгенерирует меньше всего redo.Применимо начиная с 8.0


Sergey13   (2002-01-29 10:23:00) [4]

Мне кажется лучше всего комбинация 1 и 2 вариантов. Для ID -однозначно 2 и лучше в тригере. Для последовательных номеров -1вариант с обработкой исключения на нарушение уникальности номера(про 2 юзеров). И все это в одном тригере.


oname   (2002-01-29 09:34:00) [5]

Для 1.
Чтобы не было ошибки - использовать DECODE.
Относительно 2-х юзеров - использовать LOCK TABLE в транзакции.


Yura_Neo   (2002-01-29 06:50:00) [6]

Если сервер - Oracle, то лучше вариантов нет:
Sequence на ID записи, при чем глобально для всех записей
(потом по ID можно определить принадлежность данной записи к таблице/объекту/классу и т.д., в зависимости от того, как построена структура базы).
Другая Sequence - на нумерацию, например, номеров документов.

Удачи.


fnatali   (2002-01-29 06:13:00) [7]

В клиент-серверных СУБД, к коим относится и Оракл, нужно применять второй вариант. По-моему, это стандартный подход.


Наверх

Титульная страница Поиск, карта сайта Написать письмо