Главная страница
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
1-79356
Ziv
2002-01-28 13:53
2002.02.25
Как зделать QRPreview так, чтобы он отображал QuickRep?


1-79351
mrcat
2002-02-07 18:51
2002.02.25
комиляция числовых выражений


3-79266
mcp@online.ru
2002-01-29 04:09
2002.02.25
возможно ли проводить фильтрацию данных в memo поле?


7-79480
KLM
2001-11-15 06:26
2002.02.25
Смена разрешения монитора


4-79518
Овал
2001-12-25 01:31
2002.02.25
Как написать заменитель Windows Explorer a ?