Можно ли создать в Oracle столбец идентификаторов, не являясь первичным ключом, и как он связан с базой данных H2? - PullRequest
0 голосов
/ 11 сентября 2018

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

-- FOO_BAR TABLE
id NUMBER(10) PRIMARY KEY, -- A sequence and a trigger is set up to this column.
uuid CHAR(36) UNIQUE

Я пытаюсь сделать следующее:

  1. Столбец id должен быть удален;
  2. Столбец uuid должен быть первичным ключом;
  3. Должен быть создан новый столбец с именем creation_order, и он должен иметь те же значения, что и id, но это не будет первичный ключ.

Таким образом, после миграциитаблица должна выглядеть следующим образом:

-- FOO_BAR TABLE
creation_order NUMBER(10) UNIQUE GENERATED AS IDENTITY,
uuid CHAR(36) PRIMARY KEY

Проблема, которая заставила меня создать этот вопрос, заключается в том, что я использую H2, и я должен попытаться создать сценарии миграции, максимально совместимые с SQL, поскольку Oracle позволяет мне,и поскольку GENERATED AS IDENTITY является чистым SQL и теперь поддерживается Oracle DB, я должен попытаться придерживаться этого.


Итак, мой первый вопрос:

В H2 яне может следовать этому подходу, так как GENERATED AS IDENTITY всегда будет неявно создавать ограничение PRIMARY KEY, так какуказано в Документация по базе данных H2 :

Столбцы идентификатора и автоинкремента - это столбцы с последовательностью по умолчанию.Столбец, объявленный как столбцы идентификаторов, неявно является столбцом первичного ключа этой таблицы (в отличие от столбцов с автоинкрементом).

Так что для H2 мне нужно использовать AUTO_INCREMENT.

Я искал документацию по Oracle DB и не нашел никакой информации о первичных ключах для типа идентификации, означает ли это, что Oracle GENERATED AS IDENTITY работает так же, как H2 AUTO_INCREMENT?

И если ответ положительный и GENERATED AS IDENTITY отличается для каждой базы данных, кто-нибудь имеет представление о том, как использовать один и тот же сценарий миграции для обеих баз данных, или это невозможно?

Спасибо!

1 Ответ

0 голосов
/ 11 сентября 2018

Да, это возможно (Oracle 12c):

CREATE TABLE tab (
  id INT PRIMARY KEY,
  some_identity  NUMBER GENERATED ALWAYS AS IDENTITY,  -- it is not PK
  descr VARCHAR2(30)
);

или DEFAULT:

CREATE SEQUENCE seq;

CREATE TABLE tab(
    id INT PRIMARY KEY
   ,some_identity NUMBER DEFAULT seq.NEXTVAL
   ,descr VARCHAR2(30)
);
...