|
Авто ID (автоинкремент)
|
|||
---|---|---|---|
#18+
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() вродебы никак :( ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2003, 08:28 |
|
Авто ID (автоинкремент)
|
|||
---|---|---|---|
#18+
у нас так сделано тоже давно только у нас не процедура а приложение апдейтит максимальное значение вроде затыков нет, 100-110 юзеров в базе постоянно ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2003, 08:33 |
|
Авто ID (автоинкремент)
|
|||
---|---|---|---|
#18+
> 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 уникальный идентификатор, его и используем... Метод, конечно, самопальный... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2003, 11:22 |
|
Авто ID (автоинкремент)
|
|||
---|---|---|---|
#18+
завести табльчку c одним полем. table_id ( id int) вставить туда 1 строчку. значение 0. update table_id set id = id +1; select max(id) into :id from table_id; commit; .... ? IBM вроде так и советует. не могу вспомнить, откуда я это взял. к тому же, эту транзакцию можно запстить в отдельной группе активизации, хотя не помню. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2003, 11:28 |
|
Авто ID (автоинкремент)
|
|||
---|---|---|---|
#18+
Код: plaintext
А нафига max? Просто select id ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2003, 12:40 |
|
Авто ID (автоинкремент)
|
|||
---|---|---|---|
#18+
это защита от кривых рук. ести в табличке окажется 2 записи, то select id into :id from table_id; развалится ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2003, 12:45 |
|
Авто ID (автоинкремент)
|
|||
---|---|---|---|
#18+
2 Roman Pankov. Это я прекрасно понимаю и это даже написано в документации IBM, если порыть, но !!! Как я сказал у меня DB2 под AS400 и этот гад не понимать никаких generated always as identity (start with 1, increment by 1) во как :( поэтому и проблема. Одно что у него как у всех generate_unique() - только поля все уж INTEGER :( вот. ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2003, 13:12 |
|
Авто ID (автоинкремент)
|
|||
---|---|---|---|
#18+
А самому генератор написать не судьба? Я не знаю синтаксиса 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 ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2003, 14:31 |
|
Авто ID (автоинкремент)
|
|||
---|---|---|---|
#18+
если generated always as identity по каки-то причинам не идет на as/400 (ХОТЯ ДОЛЖНО ИДТИ - ЭТО ПЛАТФОРМОНЕЗАВИСИМОЕ РАСШИРЕНИЕ SQL), то делай как предлагаешь, но блокируй таблицу перед тем как взять значение и инкрементировать его и снимай блок после commit ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2003, 16:21 |
|
Авто ID (автоинкремент)
|
|||
---|---|---|---|
#18+
Вопрос не в бровь а в глаз:)....А нафига вообще нужен в базах автоинкремент? Неплохо было бы обсудить этот вопрос всесторонне. Мое личное мнение - небоходимость в автоинкрементных полях возникает только в случае дубовой модели...)) буду рад если кто-то сумеет опровергнуть мое мнение и "поставить меня на место") ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2003, 18:14 |
|
Авто ID (автоинкремент)
|
|||
---|---|---|---|
#18+
Хм... Это типа шутка в конце трудной рабочей недели?... ;))) Или легкая провокация с надеждой на интересную дискуссию?... Тогда б хорошо в отдельную ветку, чего уж здесь-то... ... |
|||
:
Нравится:
Не нравится:
|
|||
11.04.2003, 18:23 |
|
Авто ID (автоинкремент)
|
|||
---|---|---|---|
#18+
мне кажется лучше использоват последовательность (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; ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2003, 13:25 |
|
Авто ID (автоинкремент)
|
|||
---|---|---|---|
#18+
Всем большое спасибо. Все штуки допольно интересны и практически все я их пробовал до того как. Расскажу вкратце о своих так сказать поисках решения проблемы. 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 и попользуюсь всеми вашими советами. Всем большое спасибо ... |
|||
:
Нравится:
Не нравится:
|
|||
14.04.2003, 14:36 |
|
|
start [/forum/topic.php?fid=43&fpage=164&tid=1606619]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
27ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
2ms |
others: | 12ms |
total: | 137ms |
0 / 0 |