Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.012 c
1-79370
Alicho
2002-02-07 14:54
2002.02.25
Форма в dll


14-79429
Ежик
2001-12-23 15:08
2002.02.25
Помогите плиииз установить библиотеку LMD50Se


1-79389
Grim Rider
2002-02-01 11:08
2002.02.25
Drag n Drop в элементы TEdit


1-79376
Batiskaf
2002-02-07 13:52
2002.02.25
Form Designer without Delphi


3-79254
a1st
2002-01-12 13:17
2002.02.25
PDOXUSRS.LCK задолбал





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский