Статьи

Определение столбцов идентификации в Oracle

Это всегда было серьезной жалобой на то, что мы не можем установить, чтобы первичный ключ автоматически повышался как встроенный при создании таблицы. Мы решили это либо добавлением руководства из последовательности в таблицу во время вставки, либо определив триггер для нашей таблицы и автоматически подняв столбец pk с помощью последовательности во время вставки. В Oracle 12c R1 была разработана и выпущена инфраструктура для автоматического выполнения этой операции. Теперь мы можем создать числовые столбцы, которые могут автоматически расти.

Тип столбца идентификации был разработан таким образом, чтобы поддерживать три различных функции в фоновом режиме. Мы можем выбрать и использовать то, что нам больше подходит.

Эти функции:

  1. Генерируется всегда как личность

  2. Сгенерировано по умолчанию как личность

  3. Сгенерировано по умолчанию на нуле как личность

Перед просмотром сведений об этих функциях существуют определенные ограничения для столбцов, созданных в типе идентификации. Мы определенно должны принять во внимание следующие ситуации при создании таких столбцов.

  • В одной таблице может существовать только один столбец идентификаторов.
  • Столбец идентификации, который мы создадим, обязательно должен быть определен в типе числовых данных.
  • Мы не можем определить значение по умолчанию для столбца, который мы создали в типе идентификации.
  • Если есть другой столбец идентификаторов в таблице, которую мы скопировали, используя команду create table как select, функцию идентификации этого столбца нельзя перенести во вновь созданную таблицу.
  • В тот момент, когда мы определим столбец в типе идентичности,  NOT NULL ограничение для этого столбца будет определено как неявное.

Теперь давайте проанализируем различные типы столбцов идентификаторов, приведя примеры.

1. Создано всегда как личность

Мы не можем вмешиваться извне в этот столбец идентификаторов, который мы создали с помощью этой функции. Теперь давайте посмотрим на это на примере.

CREATE TABLE tab_new_identity_col_table (
  tab_pk      NUMBER GENERATED ALWAYS AS IDENTITY,
  tab_name    VARCHAR2(50),
  tab_prop    NUMBER,
  tab_add     VARCHAR2(50)  
);


insert into tab_new_identity_col_table(tab_pk,tab_name,tab_prop,tab_add) values (10,'deneme',99,'dene12'); 

insert into tab_new_identity_col_table(tab_name,tab_prop,tab_add) values ('deneme',99,'dene12'); 

Теперь, выполнив приведенный выше блок кода, давайте посмотрим текущие журналы.

Table TAB_NEW_IDENTITY_COL_TABLE created.

Error starting at line : 9 in command -
insert into tab_new_identity_col_table(tab_pk,tab_name,tab_prop,tab_add) values (10,'deneme',99,'dene12')
Error at Command Line : 9 Column : 40
Error report -
SQL Error: ORA-32795: cannot insert into a generated always identity column
32795.0000 -  "cannot insert into a generated always identity column"
*Cause:    An attempt was made to insert a value into an identity column
           created with GENERATED ALWAYS keywords.
*Action:   A generated always identity column cannot be directly inserted.
           Instead, the associated sequence generator must provide the value.

1 row inserted

Как мы и выяснили из запущенных журналов, система получила ошибку при первой выполненной нами вставке; потому что мы отправили внешнее значение в столбец идентификаторов. Однако вторая фраза прошла успешно, и наш столбец идентификаторов начал автоматически расти, поскольку во второй фразе вставки такого вмешательства не было.

2WW2. Сгенерировано по умолчанию как личность

С помощью этой функции мы можем заполнить наш столбец идентификаторов внешним значением, но мы все еще не можем выбрать ноль. Теперь давайте тоже проанализируем это.

Теперь, когда мы запустили блок кода выше, давайте посмотрим текущие журналы.

Table TAB_NEW_IDENTITY_COL_TABLE created.


1 row inserted.


1 row inserted.

Как видно, вторая фраза была вставлена ​​успешно. Однако, поскольку значение, которое мы указали вручную, было таким же, как первое значение, автоматически созданное столбцом идентификаторов, первые значения двух записей совпадают. Если бы столбец, который мы определили в типе идентификатора, был первичным ключом, вторая фраза вызвала бы ошибку при выполнении ограничения pk.

fnl13. Сгенерировано по умолчанию на Null как личность

Если мы создадим наш столбец идентификаторов, используя эту опцию, мы сможем гарантировать, что значение столбца будет расти автоматически без каких-либо ошибок.

CREATE TABLE tab_new_identity_col_table (
  tab_pk      NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY,
  tab_name    VARCHAR2(50),
  tab_prop    NUMBER,
  tab_add     VARCHAR2(50)  
);


insert into tab_new_identity_col_table(tab_pk,tab_name,tab_prop,tab_add) values (null,'deneme',99,'dene12'); 

insert into tab_new_identity_col_table(tab_name,tab_prop,tab_add) values ('deneme',99,'dene12'); 

Поскольку мы запустили блок кода, давайте теперь посмотрим текущие журналы.

Table TAB_NEW_IDENTITY_COL_TABLE created.


1 row inserted.


1 row inserted.

Мы видим, что обе фразы вставки были выполнены успешно. Теперь давайте взглянем на состояние нашего стола.

fnl2Мы проанализировали, как его можно использовать с тремя различными функциями. Теперь давайте обсудим, что происходит в фоновом режиме.

В тот момент, когда мы создали столбец идентификаторов, он автоматически создает последовательность для этого столбца, которая выдаст автоматическое значение. После этого он выполняет операцию получения значения из этой последовательности для каждой новой записи и записи ее в таблицу. Вы можете получить последовательность, созданную для нашего столбца идентификаторов, введя словарь данных в запрос ниже.

select * from ALL_TAB_IDENTITY_COLS;

fnl3Как вы поняли из этого словарного запроса, мы показали, что последовательность была создана в фоновом режиме. Это может привести к вопросу: можем ли мы специализировать принцип работы последовательности при создании столбца идентификаторов? Другими словами, с мы делаем продвижение последовательности за счет увеличения на пять? Ответ — да. Давайте продемонстрируем это на примере ниже:

CREATE TABLE tab_new_identity_col_table (
  tab_pk      NUMBER GENERATED ALWAYS AS IDENTITY(START WITH 1 INCREMENT BY 5),
  tab_name    VARCHAR2(50),
  tab_prop    NUMBER,
  tab_add     VARCHAR2(50)  
);


insert into tab_new_identity_col_table(tab_name,tab_prop,tab_add) values ('deneme',99,'dene12'); 

insert into tab_new_identity_col_table(tab_name,tab_prop,tab_add) values ('deneme',99,'dene12'); 

insert into tab_new_identity_col_table(tab_name,tab_prop,tab_add) values ('deneme',99,'dene12'); 

fnl4Как видно, мы можем специализировать последовательность, которую tgat создает в столбце идентификаторов.
В этой статье я проанализировал столбец идентификаторов, который является одной из новых характеристик, которые появились в 12c, и его возможностей. Я надеюсь, что это была полезная статья для вашей осведомленности.