powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Текущее значение индекса автоинкремента уникального столбца
18 сообщений из 18, страница 1 из 1
Текущее значение индекса автоинкремента уникального столбца
    #38894242
ASukhov1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У меня есть таблица (например, Table1) в бд и у нее есть столбец (например, ID), который является первичным ключом и определяется автоинкрементом с шагом 1.
Как мне определить текущее значение счетчика автоинкремента?
И как мне его поменять на некоторое значение, например, 18?
...
Рейтинг: 0 / 0
Текущее значение индекса автоинкремента уникального столбца
    #38894277
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ASukhov1986,

Чтобы узнать текущее значение, гадо его "потребить", т.е. вставить запись, после чего сделать rollback.
Правда, увеличение значения счетчика не откатится.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
create table test_inc(
  id int not null generated always as identity
, v int
) in userspace1;

-- with autocommit set to OFF
select id
from new table(
insert into test_inc (id, v) values (default, 0)
);

rollback;

-- resetting
alter table test_inc alter id restart with 18;
...
Рейтинг: 0 / 0
Текущее значение индекса автоинкремента уникального столбца
    #38894344
ASukhov1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,
спасибо тогда у меня следующий вопрос:
Я выполнил миграцию БД на DB2 с 9 на 10.55 с помощью утилиты db2move (export, создал с помощью команды create database БД, import, написал скрипт добавления функций процедур, триггеров и т.д.).
Затем в моей системе начал добавлять (обновлять) в таблицу новую запись INSERT INTO WORK_PLACE_ACTUAL (LOCAL_CODE_ID,WORK_PLACE_NAME,SESS_ID) VALUES(6,'788',19) возникла следующая ошибка:
DB21034E The command was processed as an SQL statement because it was not a
valid Command Line Processor command. During SQL processing it returned:
SQL0723N An error occurred in a triggered SQL statement in trigger
"METR.WORK_PLACE_INS". Information returned for the error includes SQLCODE
"-803", SQLSTATE "23505" and message tokens "1|METR.WORK_PLACE".
SQLSTATE=09000.
Как ее исправить?
...
Рейтинг: 0 / 0
Текущее значение индекса автоинкремента уникального столбца
    #38894346
ASukhov1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein, триггер тут непричем, т.к. на DB2 9 все работает правильно!
...
Рейтинг: 0 / 0
Текущее значение индекса автоинкремента уникального столбца
    #38894359
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ASukhov1986,

Какое-то действие, которое вы делаете с таблицей METR.WORK_PLACE в триггере на WORK_PLACE_ACTUAL, приводит к появлению дублей в уникальном индексе:
Код: sql
1.
2.
3.
4.
5.
SELECT INDNAME, INDSCHEMA
  FROM SYSCAT.INDEXES
  WHERE IID = 1
  AND TABSCHEMA = 'METR'
  AND TABNAME = 'WORK_PLACE'

Вам надо разобраться, почему это происходит.
...
Рейтинг: 0 / 0
Текущее значение индекса автоинкремента уникального столбца
    #38894431
ASukhov1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,

я еще заметил, что e DB2 9 в системной таблице SYSIBM.SYSTABLES есть моя таблица WORK_PLACE креэйтор METR, в в DB2 10.55 нет. может это как то влиять или нет на возникновение этой ошибки?
...
Рейтинг: 0 / 0
Текущее значение индекса автоинкремента уникального столбца
    #38894443
ASukhov1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein, последнее сообщение неверно, проверил запросом select * from SYSIBM.SYSTABLES where CREATOR='METR'
...
Рейтинг: 0 / 0
Текущее значение индекса автоинкремента уникального столбца
    #38894464
ASukhov1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein, я разобрался нужно выполнить следующий скрипт alter table WORK_PLACE alter WORK_PALCE_ID restart with 100
где 100 - это максимальное значение WORK_PALCE_ID плюс 1 .
...
Рейтинг: 0 / 0
Текущее значение индекса автоинкремента уникального столбца
    #38894472
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ASukhov1986,

db2look на db2 9 должна была сгенерировать в числе прочего и команды рестарта sequence/identity.
Вы ей пользовались для переноса DDL?
...
Рейтинг: 0 / 0
Текущее значение индекса автоинкремента уникального столбца
    #38894657
ASukhov1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,
нет
...
Рейтинг: 0 / 0
Текущее значение индекса автоинкремента уникального столбца
    #38894660
ASukhov1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein, export->create database->import->create all other objects
...
Рейтинг: 0 / 0
Текущее значение индекса автоинкремента уникального столбца
    #38894768
ASukhov1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Как в DB2 в команде
alter table WORK_PLACE alter WORK_PALCE_ID restart with 100
вместо значение 100 реализовать select value(max(METR.WORK_PALCE_ID),0)+1 from METR.WORK_PLACE
...
Рейтинг: 0 / 0
Текущее значение индекса автоинкремента уникального столбца
    #38894946
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ASukhov1986,

Никак.
Такие запросы можно генерировать в несколько приемов.
Вам надо последовательно:

- Выполнить запрос (1):
Код: sql
1.
2.
3.
select 'select ''alter table "'||tabschema||'"."'||tabname||'" alter "'||colname||'" restart with ''||char(value(max("'||colname||'"), 0)+1) from "'||tabschema||'"."'||tabname||'"'
from syscat.colidentattributes
where tabschema='METR' and tabname='WORK_PLACE'


- он вернет текст запроса (2), который надо выполнить
- результатом будет та команда (ALTER), которая вам нужна

Таким образом, убрав WHERE в запросе (1), можно хоть для всех IDENTITY в базе сразу сгенерировать команды рестарта.
Только на каждом этапе будут возвращаться не отдельные команды, а несколько - по числу IDENTITY полей.
...
Рейтинг: 0 / 0
Текущее значение индекса автоинкремента уникального столбца
    #38896360
ASukhov1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,а как выполнить полученную команду, в MS SQL SERVER есть процедура sp_executesql, а как в DB2?
...
Рейтинг: 0 / 0
Текущее значение индекса автоинкремента уникального столбца
    #38896858
ASukhov1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Mark Barinstein,
вот моя процедура, которая реализует обновление RESTART для всех таблиц БД

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
CREATE OR REPLACE PROCEDURE UPDATE_RESTART_VALUE() 
AS:
BEGIN
	DECLARE t_cur_end INTEGER DEFAULT 0;--Лог. переменная признака завершения курсора
	DECLARE tabname_cur varchar(1000);--Название таблицы
	declare sql_text_command varchar(1000);--Текст команды select 'alter...'
	
	DECLARE t CURSOR FOR
	select tabname from syscat.colidentattributes
    where tabschema='METR';
    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET t_cur_end=1;
             
    OPEN t;
    
    FETCH t INTO tabname_cur;

    WHILE (t_cur_end=0) DO
         set sql_text_command=(select 'select ''alter table "'||tabschema||'"."'||tabname||'" alter "'||colname||'" restart with ''||char(value(max("'||colname||'"), 0)+1) from "'||tabschema||'"."'||tabname||'"'
                               from syscat.colidentattributes
                               where tabschema='METR' and tabname=tabname_cur);
                               
         EXECUTE IMMEDIATE sql_text_command;
   
         FETCH t INTO tabname_cur;
   END WHILE;

   CLOSE t;
END



при выполнении команды
Код: plsql
1.
EXECUTE IMMEDIATE sql_text_command;

возникает следующая ошибка: An EXECUTE IMMEDIATE statement contains a SELECT or VALUES statement.. SQLCODE=-84, SQLSTATE=42612, DRIVER=4.18.60.
Как ее устранить? Я так понял что в команде EXECUTE IMMEDIATE не должно быть команды SELECT, тогда существует другая команда кроме EXECUTE IMMEDIATE?
...
Рейтинг: 0 / 0
Текущее значение индекса автоинкремента уникального столбца
    #38896905
ASukhov1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ASukhov1986,вопрос решен
...
Рейтинг: 0 / 0
Текущее значение индекса автоинкремента уникального столбца
    #38896911
ASukhov1986
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ASukhov1986, через PREPARE S1 FROM DSQL;
EXECUTE S1;
...
Рейтинг: 0 / 0
Текущее значение индекса автоинкремента уникального столбца
    #38897006
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ASukhov1986,

Как-то так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
--#SET TERMINATOR @
set serveroutput on@

begin
  declare stmt varchar(4000);

  for c1 as 
  select 'select ''alter table "'||tabschema||'"."'||tabname||'" alter "'||colname||'" restart with ''||char(value(max("'||colname||'"), 0)+1) from "'||tabschema||'"."'||tabname||'"' stmt
  from syscat.colidentattributes
  where tabschema='METR'
  do
    set stmt = 'set ? = ('||c1.stmt||')';
    prepare s1 from stmt;
    execute s1 into stmt;
    --execute immediate stmt;
    call dbms_output.put_line(stmt);
  end for;
end@


Може выполнить как есть, чтоб посмотреть, какая команда для каждой таблицы будет выполняться.
Если хотите оформить в виде процедуры то заверните begin ... end в процедуру, раскомментируйте execute immediate, уберите call.
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Текущее значение индекса автоинкремента уникального столбца
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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