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

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

.....
stax
...
Рейтинг: 0 / 0
Автоинкрементное поле для заполненной таблицы
    #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
Автоинкрементное поле для заполненной таблицы
    #40136007
Mildb
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Stax,

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

А если поле задумывается как автоинкрементное, то будет ли новая запись нумероваться автоматически в дальнейшем?
...
Рейтинг: 0 / 0
Автоинкрементное поле для заполненной таблицы
    #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
Автоинкрементное поле для заполненной таблицы
    #40136059
dmdmdm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А если

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

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

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

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


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