Форум: "Базы";
Текущий архив: 2002.02.25;
Скачать: [xml.tar.bz2];
ВнизКак лучше всего автонумеровать добавляемые записи? Найти похожие ветки
← →
Максимка (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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.004 c