powered by simpleCommunicator - 2.0.44     © 2025 Programmizd 02
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Авто ID (автоинкремент)
13 сообщений из 13, страница 1 из 1
Авто ID (автоинкремент)
    #32138111
AlexMaslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Hi, all

Возникла такая вот проблема.

DB2 под AS/400

есть таблица с ID, который по суте своей - авто инремент.
в хранимой процедуре в нее вставляются данные. Ввиду того, что клиентов может быть много и реальна ситуация одновременного вызова этой процедуры несколькими клиентами.
подход типа
select max(name)+1 INTO newID from tabl;
insert insto tabl ...... vlues(max.....

приводит к появлению Dublicate key
И дело в том, что процедура должна возвращать этот новый ID клиенту.

Наверняка кто-то сталкивался с такой проблемой.
Есть какие-нибудь мысли по этому поводу?

P.S.
ID - INTEGER и это было сделано давно, т.е. простым generate_unique() вродебы никак :(
...
Рейтинг: 0 / 0
Авто ID (автоинкремент)
    #32138113
zav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
zav
Гость
у нас так сделано тоже давно
только у нас не процедура а приложение апдейтит максимальное значение
вроде затыков нет, 100-110 юзеров в базе постоянно
...
Рейтинг: 0 / 0
Авто ID (автоинкремент)
    #32138314
Roman Pankov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
> AlexMaslov

Метод "max+1" - стопроцентный источник проблем при многопользовательском доступе, это верно... Если можно пересоздать таблицу, то лучше указать тип:
ID integer not null generated always as identity (start with 1, increment by 1)

Пока что можно посоветовать извратиться:
1) Создать таблицу с автоинкрементным полем, например:
create table GEN (ID integer not null generated always as identity (start with 1, increment by 1) unique, LEFTVAL integer)
2) При надобности вставить куда-то строку с уникальным ID выполнить в отдельной хранимой процедуре или еще где:
delete from GEN;
insert into GEN (LEFTVAL) values (0);
select identity_val_local() into NEW_ID from sysibm.sysdummy1;
получаем в NEW_ID уникальный идентификатор, его и используем...

Метод, конечно, самопальный...
...
Рейтинг: 0 / 0
Авто ID (автоинкремент)
    #32138327
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
завести табльчку c одним полем. table_id ( id int) вставить туда 1 строчку. значение 0.

update table_id set id = id +1;
select max(id) into :id from table_id;
commit;
....
?

IBM вроде так и советует. не могу вспомнить, откуда я это взял.
к тому же, эту транзакцию можно запстить в отдельной группе активизации, хотя не помню.
...
Рейтинг: 0 / 0
Авто ID (автоинкремент)
    #32138485
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
select max(id) 


А нафига max? Просто select id
...
Рейтинг: 0 / 0
Авто ID (автоинкремент)
    #32138495
Фотография NewYear
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
это защита от кривых рук. ести в табличке окажется 2 записи, то
select id into :id from table_id;
развалится
...
Рейтинг: 0 / 0
Авто ID (автоинкремент)
    #32138556
AlexMaslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Roman Pankov.
Это я прекрасно понимаю и это даже написано в документации IBM, если порыть, но !!!
Как я сказал у меня DB2 под AS400 и этот гад не понимать
никаких
generated always as identity (start with 1, increment by 1)

во как :( поэтому и проблема.
Одно что у него как у всех generate_unique() - только поля все уж INTEGER :(
вот.
...
Рейтинг: 0 / 0
Авто ID (автоинкремент)
    #32138747
Фотография Журавлев Денис
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А самому генератор написать не судьба?

Я не знаю синтаксиса DB2 поэтому возможны ошибки:

CREATE TABLE Generators (
Name CHAR(30) NOT NULL PRIMARY KEY,
Value INTEGER NOT NULL DEFAULT 1
)

CREATE PROCEDURE Gen_Id (GenName CHAR(30)) INTEGER

LET Val=0

SET RETAIN UPDATE LOCKS;

SELECT Value INTO Val
FROM Generators
WHERE Name = GenName
FOR UPDATE (Value)

UPDATE Generators
SET Value = Value + 1
WHERE Name = GenName

COMMIT
RETURN val

END PROCEDURE
...
Рейтинг: 0 / 0
Авто ID (автоинкремент)
    #32138949
adolf
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
если generated always as identity по каки-то причинам не идет на as/400 (ХОТЯ ДОЛЖНО ИДТИ - ЭТО ПЛАТФОРМОНЕЗАВИСИМОЕ РАСШИРЕНИЕ SQL), то делай как предлагаешь, но блокируй таблицу перед тем как взять значение и инкрементировать его и снимай блок после commit
...
Рейтинг: 0 / 0
Авто ID (автоинкремент)
    #32139135
gardenman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос не в бровь а в глаз:)....А нафига вообще нужен в базах автоинкремент?
Неплохо было бы обсудить этот вопрос всесторонне.
Мое личное мнение - небоходимость в автоинкрементных полях возникает только в случае дубовой модели...)) буду рад если кто-то сумеет опровергнуть
мое мнение и "поставить меня на место")
...
Рейтинг: 0 / 0
Авто ID (автоинкремент)
    #32139152
Roman Pankov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Хм... Это типа шутка в конце трудной рабочей недели?... ;)))

Или легкая провокация с надеждой на интересную дискуссию?... Тогда б хорошо в отдельную ветку, чего уж здесь-то...
...
Рейтинг: 0 / 0
Авто ID (автоинкремент)
    #32139866
Algedi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
мне кажется лучше использоват последовательность (sequence), сделать авто инкремент 1 и никаких проблем:

создание последовательности
alter sequence For_COMMQUEUE;

установка параметров
alter sequence For_COMMQUEUE
restart with 1
increment by 1
nomaxvalue
nocycle
nocache;

получить следующее значение можно с помощью команды
NEXTVAL FOR For_COMMQUEUE

или при создании таблицы создать автоинкремент
CREATE TABLE AFUELS.COMMQUEUE
(COM_UID INTEGER NOT NULL GENERATED ALWAYS
AS IDENTITY (START WITH 1, INCREMENT BY 1, NO CACHE, MINVALUE 1, MAXVALUE 2147483647, CYCLE, NO ORDER),
)
DATA CAPTURE NONE
IN USERSPACE1;

ALTER TABLE AFUELS.COMMQUEUE
LOCKSIZE ROW
APPEND OFF
NOT VOLATILE;
...
Рейтинг: 0 / 0
Авто ID (автоинкремент)
    #32139952
AlexMaslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем большое спасибо.

Все штуки допольно интересны и практически все я их пробовал до того как.
Расскажу вкратце о своих так сказать поисках решения проблемы.
OS: AS/400 DB2 V5R1

CREATE GENERATOR - не представляется возможным ввиду отсутствия таковой возможности.
GENERATED ALWAYS AS IDENTITY - аналогично UNSOPPORTED
C LOCK таблицы - ничего хорошего, т.к. потоянный Exception FILE IN USE bla-bla-bla
Про SEQUENCE мне кажется, что тоже UNSOPPORTED хотя возможно и нет - это я сейчас проверю, спасибо большое.
С CREATE FUNCTION - боюсь будут теже проблемы - хотя могу и ошибаться (что-то мне какжется что они не thread-safe)

А вот на что я набрел всякие там GENERATED ALWAYS и т.п. supported в
AS/400 DB2 V5R2
Поэтому думаю, что обновлю я до этого R2 и попользуюсь всеми вашими советами.

Всем большое спасибо
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Авто ID (автоинкремент)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]