Гость
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Автоинкрементное поле для заполненной таблицы / 9 сообщений из 9, страница 1 из 1
22.02.2022, 18:07
    #40135954
Mildb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоинкрементное поле для заполненной таблицы
Всем привет! Есть готовая таблица с 15к записями с полем c_id (отсчет идет со 152), туда необходимо добавить автоинкрементное поле id. При этом каждой записи, начиная со 152, присвоить числовое Соответствующее значение — c_id = 152 и id = 152 итд. Однако в таблице есть записи без значения c_id, то есть null, их тоже необходимо заполнить id без потери порядка. Понимаю, что нужно скорее всего использовать merge и сортировку по c_id, но не понимаю как добавить такое автоинкрементное поле и пронумеровать со 152 уже имеющиеся записи
...
Рейтинг: 0 / 0
22.02.2022, 19:59
    #40135969
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоинкрементное поле для заполненной таблицы
Mildb,

у Вас автоинкрементное поле, или ид будет генерится в триггере?

.....
stax
...
Рейтинг: 0 / 0
22.02.2022, 20:13
    #40135971
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоинкрементное поле для заполненной таблицы
Пронумеровать по любому принципу - не проблема.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
SQL> insert into t1 (id, val) select null, round(dbms_random.value*1000, 0) from dual connect by level < 1001;

1000 rows inserted


SQL> 
SQL> merge into t1 using (select rownum-1 id from dual connect by level< 1002) new_id on (t1.val = new_id.id)
  2   when matched then update set t1.id = new_id.id;

1000 rows merged




А вот эти identity columns, видимо, туда-сюда менять нельзя, только новая колонка или таблица.

Код: 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.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
Connected to Oracle Database 18c Express Edition Release 18.0.0.0.0 
Connected as user1@DBOFFICEXE

SQL> create table ttt(id number, val number);

Table created


SQL> insert into ttt select null, round(dbms_random.value*1000, 0) from dual connect by level < 1001;

1000 rows inserted

SQL> alter table ttt modify id GENERATED ALWAYS as IDENTITY(START with 2001 INCREMENT by 1);
alter table ttt modify id GENERATED ALWAYS as IDENTITY(START with 2001 INCREMENT by 1)

ORA-30673: column to be modified is not an identity column


SQL> create table t1( id NUMBER GENERATED ALWAYS as IDENTITY(START with 1 INCREMENT by 1),
  2  val NUMBER
  3  );

Table created


SQL> alter table t1 modify id GENERATED ALWAYS as IDENTITY(START with 2001 INCREMENT by 1);

Table altered


SQL> create sequence ttt_sq;

Sequence created


SQL> alter table t1 modify id default ttt_sq.nextval;
alter table t1 modify id default ttt_sq.nextval

ORA-30674: identity column cannot have a default value

SQL> create table t1( id NUMBER GENERATED ALWAYS as IDENTITY(START with 1 INCREMENT by 1),
  2  val number
  3  );

Table created


SQL> alter table T1 modify id drop identity;

Table altered

---- таки drop можно

SQL> alter table t1 modify id default ttt_sq.nextval;

Table altered

...
Рейтинг: 0 / 0
22.02.2022, 23:28
    #40136007
Mildb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоинкрементное поле для заполненной таблицы
Stax,

Автоинкрементное
...
Рейтинг: 0 / 0
22.02.2022, 23:30
    #40136008
Mildb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоинкрементное поле для заполненной таблицы
dmdmdm,

А если поле задумывается как автоинкрементное, то будет ли новая запись нумероваться автоматически в дальнейшем?
...
Рейтинг: 0 / 0
23.02.2022, 10:07
    #40136044
Stax
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоинкрементное поле для заполненной таблицы
Mildb,

я б делал без мерже

1) update t set id=c_id where c_id is not null
2) update t set id=rownum+(select max(id) from t ) where id is null
3) select max(id)+1 next_id from t
4) alter table t modify id GENERATED ALWAYS as IDENTITY(START with next_id INCREMENT by 1);
взято с 22437553

ps
отдельная тема заполнения дырок, не расматривал
....
stax
...
Рейтинг: 0 / 0
23.02.2022, 12:42
    #40136059
dmdmdm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоинкрементное поле для заполненной таблицы
А если

Я теряюсь с вашей лени.

Готовые команды набросал. Нет бы взять и попробовать.
...
Рейтинг: 0 / 0
23.02.2022, 12:56
    #40136063
Mildb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоинкрементное поле для заполненной таблицы
Stax,

Спасибо! значения присваиваются!
...
Рейтинг: 0 / 0
23.02.2022, 12:58
    #40136064
Mildb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Автоинкрементное поле для заполненной таблицы
dmdmdm,

Я Вам бесконечно благодарен за указанные команды, но возникали ошибки на практике, например, с generated always. Сидел разбирался, но решил уточнить у компетентных людей.
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Автоинкрементное поле для заполненной таблицы / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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