Главная страница
    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.004 c
1-79318
Aleksey_K
2002-02-07 17:22
2002.02.25
Помогите пожалуста


3-79297
tatk
2002-01-30 19:16
2002.02.25
Результат запроса -> в переменную (массив)


3-79249
Fareader
2002-01-29 15:30
2002.02.25
Коды ошибок Interbase


3-79257
ТеньЛуны
2002-01-30 18:12
2002.02.25
Виртуальная таблица


7-79478
miDDTrich
2001-11-20 14:01
2002.02.25
Где в win2000 прописать размер environment?





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский