Можно ли сгенерировать уникальное числовое значение для каждой строки в таблице iSeries без зацикливания? - PullRequest
2 голосов
/ 20 февраля 2012

У меня есть таблица iSeries с тысячами строк, и в качестве ключа таблицы был добавлен новый числовой / целочисленный столбец.В основном это будет столбец с целочисленным идентификатором (1,2,3 ...).

Допустим, я не могу сделать этот столбец автоинкрементным.Есть ли простой способ присваивать уникальные инкрементные значения каждой строке без необходимости циклически перебирать каждую запись, присваивая значение?Возможно, какой-то запрос ОБНОВЛЕНИЯ?

Ответы [ 3 ]

4 голосов
/ 21 февраля 2012

Вы можете использовать объект Sequence.Например,

CREATE SEQUENCE MySeq
    as {numeric-datatype}

Тип данных может быть SMALLINT, INTEGER, BIGINT, DECIMAL или NUMERIC с нулевой шкалой (т. Е. Без десятичных разрядов).Для хранения значения создается область данных.

Затем можно использовать выражение NEXT VALUE FOR для извлечения и увеличения последовательности, как в

UPDATE MyTable SET id = NEXT VALUE FOR MySeq

Если вы хотите узнать последнееВ качестве присвоенного значения можно использовать выражение Previous value for mySeq

. Этот метод не будет таким быстрым, как RRN (), но может быть полезен в некоторых случаях, например, если вы хотите, чтобы числа были уникальными для разных таблиц.

4 голосов
/ 20 февраля 2012

Вы можете использовать скалярную функцию RRN , чтобы назначить относительный номер записи:

update table set id=rrn(table)
0 голосов
/ 10 октября 2016

Вероятно, самым простым [и самым быстрым] является при добавлении нового столбца [что не может быть автоинкрементом столбца], чтобы добавить столбец как GENERATED ALWAYS AS IDENTITY [ таким образом, является автоинкрементным столбцом], а затем атрибутом этого столбца с ALTER TABLE до DROP IDENTITY, так что столбец больше не является автоинкрементным столбцом. Не нужно создавать отдельную ПОСЛЕДОВАТЕЛЬНОСТЬ. Конечно, сначала обязательно проведите тестирование с дубликатом ТАБЛИЦЫ, который будет изменен, и лучше всего использовать небольшую выборку данных в этой копии [так что тестирование на самом деле должно иметь дело и с данными], и, наконец, проверьте атрибуты столбца для таких вещей, как настройки DEFAULT и NULL; то есть требования ADD COLUMN и / или ALTER COLUMN могут отличаться от приведенных ниже в качестве упрощенного примера [проверено в DB2 для i5 / OS в v5r3; Предполагается, что через DB2 для IBM i 7.3 он будет таким же успешным:

  alter table has_no_id /* err, will have ID column, afterward */
    add column   id_added integer generated always as identity
  ;
  alter table has_no_id /* err, will since, have no ID column  */
    alter column id_added drop identity 
  ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...