Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.02.25;
Скачать: CL | DM;

Вниз

Как лучше всего автонумеровать добавляемые записи?   Найти похожие ветки 

 
Максимка   (2002-01-28 21:35) [0]

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

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


 
fnatali ©   (2002-01-29 06:13) [1]

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


 
Yura_Neo ©   (2002-01-29 06:50) [2]

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

Удачи.


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

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


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

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


 
petr_v_a ©   (2002-01-29 11:18) [5]

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


 
Shirson ©   (2002-01-30 09:27) [6]

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


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

Наиболее надежный вариант на мой взгляд: создать 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;



Страницы: 1 вся ветка

Текущий архив: 2002.02.25;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.011 c
3-79301
sdn
2002-01-30 11:34
2002.02.25
FireBird и UDF... Проблемы?


14-79441
Z
2002-01-06 18:44
2002.02.25
Скажите, а как давно вышел русский WinXP и вышел ли он вообще?


3-79262
kay
2002-01-30 08:47
2002.02.25
BDE Admin


1-79317
Socol
2002-02-07 07:31
2002.02.25
Генератор паролей!


14-79440
evgeg
2002-01-08 03:17
2002.02.25
Profiler для Дельфи 2