Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Автоинкремент в пределах... / 8 сообщений из 8, страница 1 из 1
27.04.2010, 15:17
    #36600827
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоинкремент в пределах...
Здравствуйте всем!
DB2 8.2.

Можно ли создать таблицу, в которой значение одного поля автоматически бы инкрементировалось в пределах значения другого поля или набора полей? Например, нужно выполнять автонумерацию в пределах года:
Код: plaintext
1.
2.
3.
4.
5.
6.
YEAR  NUM
----------
2009  1
2009  2
2010  1
2009  3

Поле со свойством generated always as identity автоинкрементируется в пределах всех записей. Не подходит. Может, существует другое решение?

Буду благодарен за пример.

С уважением, Семен Попов
...
Рейтинг: 0 / 0
27.04.2010, 16:38
    #36601094
BuryCommoner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоинкремент в пределах...
Можно сделать предвставочным триггером типа:
Код: plaintext
SET new_row.num = (SELECT VALUE(MAX(num),  0 ) +  1  FROM mytable WHERE year = new_row.year);
...
Рейтинг: 0 / 0
27.04.2010, 17:01
    #36601187
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоинкремент в пределах...
Понятно. А не будет ли проблем в многопользовательском режиме? Ведь подобным образом можно заменить и свойство generated always as identity , но разработчики почему-то триггеры для реализации этого свойства не используют. Я где-то читал, что это может доставить проблемы. По мне, так было бы хорошо, чтобы пользователь видел будущий номер еще при заполнении формы перед сохранением записи. То есть, перед открытием формы делаю запрос для получения последнего номера, инкрементирую его и предлагаю пользователю. Но беда - при сохранении он уже может быть занят. Придется дополнительно предусмореть и такую ситуацию.
...
Рейтинг: 0 / 0
27.04.2010, 18:24
    #36601449
BuryCommoner
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоинкремент в пределах...
Насчет проблем с триггерами не знаю, но можно попробовать запрос делать с WITH UR.
Для генерации новых значений с условием в любом случае надо будет где-то хранить состояние счетчиков. Можно так же добавить в таблицу признак сохраненности, и при отображении формы делать вставку "пустой строки". При окончательном сохранении проставлять признак.
...
Рейтинг: 0 / 0
27.04.2010, 18:32
    #36601462
Mark Barinstein
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоинкремент в пределах...
Semen Popov,

Java функция, на вход которой подаётся имя sequence.
Для каждого года в таблице заводите свой sequence.

Nextval.java
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 import  java.sql.*;

 public   class  Nextval {
	
	 public   static   int  nextval(String seqname)  throws  SQLException {
		Connection con =  null ;
		Statement st =  null ;
		ResultSet rs =  null ;
		 try  {
			con = DriverManager.getConnection("jdbc:default:connection");
			con.setAutoCommit(false);
			st = con.createStatement();
			rs = st.executeQuery("values nextval for " + seqname);
			 return  rs.next()?rs.getInt( 1 ): 0 ;
		}  finally  {
			 if  (rs !=  null ) {rs.close(); rs =  null ;}
			 if  (st !=  null ) {st.close(); st =  null ;}
			 if  (con !=  null ) {con.close(); con =  null ;}
		}
	}
}

javac Nextval.java
copy Nextval.class ...\SQLLIB\FUNCTION

Nextval.sql
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
create function nextval(seqname varchar( 128 ))
RETURNS int
LANGUAGE Java
EXTERNAL NAME 'Nextval.nextval'
FENCED THREADSAFE
READS SQL DATA
NOT NULL CALL
NO EXTERNAL ACTION
DISALLOW PARALLEL
PARAMETER STYLE java;


Код: plaintext
1.
2.
3.
4.
create sequence myschema.mytab_2009;
create sequence myschema.mytab_2010;

select year, nextval('myschema.mytab_'||rtrim(char(year))) num
from myschema.mytab;
...
Рейтинг: 0 / 0
27.04.2010, 23:13
    #36601824
Victor Metelitsa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоинкремент в пределах...
Задача напомнила мне партишионирование-для-бедных, т.е. когда для каждого года создаётся (заранее) отдельная таблица, а потом поверх всех них делается view с union all. Можно ведь и так поступить.

А ещё у меня есть большое подозрение, что нам сказали не всё условие задачи, и что на самом деле впридачу ещё нужно, чтобы последовательность в NUM была без дырок. Так что, может, лучше обойтись без sequence-по-годам и вообще поля NUM, а вычислять в запросе через row_number()over(partition by year order by что-нибудь-вроде-таймштампа-вставки).

А если всё-таки использовать sequence, не забудьте выключить кеширование sequence и не забудьте тот небольшой факт, что sequence на rollback назад не откатится. Автоинкрементых полей то же самое касается.
...
Рейтинг: 0 / 0
28.04.2010, 07:00
    #36601999
const64
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоинкремент в пределах...
Semen PopovПонятно. А не будет ли проблем в многопользовательском режиме? Ведь подобным образом можно заменить и свойство generated always as identity , но разработчики почему-то триггеры для реализации этого свойства не используют. Я где-то читал, что это может доставить проблемы.
У нас реализовано подобное триггерами, и работает именно в многопользовательском режиме.
...
Рейтинг: 0 / 0
28.04.2010, 10:49
    #36602333
Semen Popov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоинкремент в пределах...
Всем большое спасибо. Попробую выбрать оптимальный вариант для нашего случая.
...
Рейтинг: 0 / 0
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / Автоинкремент в пределах... / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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