是否可以在Oracle中创建一个Identity列而不将其作为主键,并且它与H2数据库有何关系?

时间:2018-09-11 15:52:26

标签: sql oracle h2

我正在尝试转换表以开始使用自然键而不是替代键,因此在解释我要做什么之前,我将解释数据库的当前设置。

-- 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,并且我应该尝试创建迁移脚本,因为Oracle允许我这样做的原因是最纯净的SQL兼容,并且GENERATED AS IDENTITY是纯净的SQL,现在得到了Oracle DB的支持,我应该坚持下去。


所以,我的第一个问题是:

在H2中,我无法采用这种方法,因为GENERATED AS IDENTITY总是会隐式创建一个PRIMARY KEY约束,如H2 Database Documentation中所指出:

  

Identity和auto-increment列是默认序列的列。声明为标识列的列隐式是此表的主键列(与自动增量列不同)。

因此对于H2,我需要改用AUTO_INCREMENT

我正在寻找documentation of Oracle DB,但没有找到有关身份类型主键的任何信息,这是否意味着Oracle的GENERATED AS IDENTITY像H2的AUTO_INCREMENT一样工作?

如果答案是肯定的,并且每个数据库的GENERATED AS IDENTITY不同,那么是否有人对如何在两个数据库中使用相同的迁移脚本有任何想法,还是不可能?

谢谢!

1 个答案:

答案 0 :(得分:3)

是的,有可能(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)
);