Что происходит с содержимым столбца при изменении свойства Identity баз данных DB2 v11? - PullRequest
0 голосов
/ 21 июня 2019

Сохранятся ли значения столбцов идентификаторов уже заполненных таблиц при изменении свойств столбцов идентификаторов?

У меня есть две таблицы с одним столбцом идентификаторов INTEGER.В одной таблице table1 я просто хочу отключить это свойство.В другой таблице table2 я хочу изменить диапазон значений счетчика идентификаторов.

Идея сделать это заключается в следующем:

db2 "alter table <table1> ALTER COLUMN <column> drop IDENTITY"

db2 "alter table <table2> ALTER COLUMN <column> drop IDENTITY" 
db2 "alter table <table2> ALTER COLUMN <column> set generated always as identity  
     (START WITH 1, INCREMENT BY 1, MINVALUE 1, MAXVALUE 65536, CYCLE, NO CACHE, NO ORDER)".

Поскольку я изменяю только свойства столбца в таблице 1 и увеличиваю диапазон значений столбца в таблице 2, я ожидаюзначения в соответствующих столбцах должны быть сохранены.Или все значения всегда равны NULL с пропуском IDENTITY?

1 Ответ

2 голосов
/ 21 июня 2019

Это довольно легко проверить самостоятельно, не так ли?

[db2inst1@somehost ~]$ db2 "create table test(f1 int not null generated always as identity, f2 varchar(20))"
DB20000I  The SQL command completed successfully.
[db2inst1@somehost ~]$ db2 "insert into test (f2) values ('foobar')"
DB20000I  The SQL command completed successfully.
[db2inst1@somehost ~]$ db2 "insert into test (f2) values ('foobar')"
DB20000I  The SQL command completed successfully.
[db2inst1@somehost ~]$ db2 "select * from test"

F1          F2
----------- --------------------
          1 foobar
          2 foobar

  2 record(s) selected.

[db2inst1@somehost ~]$ db2 "alter table test alter column f1 drop identity"
DB20000I  The SQL command completed successfully.
[db2inst1@somehost ~]$ db2 "select * from test"

F1          F2
----------- --------------------
          1 foobar
          2 foobar

  2 record(s) selected.

Так что нет, существующие значения прежних IDENTITY не будут изменены.

Обратите внимание, однако, что если вы заново создаете идентичность на table2 так, как вы показываете, она сгенерирует хотя бы некоторые значения, которые перекрываются с существующими значениями, что приведет к дублированию «идентичностей» или вставке исключений.

[db2inst1@somehost ~]$ db2 "alter table test alter column f1 set generated always as identity
>      (START WITH 1, INCREMENT BY 1, MINVALUE 1)"
DB20000I  The SQL command completed successfully.
[db2inst1@somehost ~]$ db2 "insert into test (f2) values ('foobar')"
DB20000I  The SQL command completed successfully.
[db2inst1@somehost ~]$ db2 "select * from test"

F1          F2
----------- --------------------
          1 foobar
          2 foobar
          1 foobar

  3 record(s) selected.
...