是否可以在Oracle中创建标识列而不是主键,它与H2数据库有何关联?

问题描述 投票:3回答:1

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

-- 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的迁移脚本,因为Oracle允许我,并且因为GENERATED AS IDENTITY是纯SQL而且它现在由Oracle DB支持,我应该试着坚持下去。


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

在H2中,我无法遵循这种方法,因为GENERATED AS IDENTITY将始终隐含地创建PRIMARY KEY约束,如H2 Database Documentation所指出:

标识和自动增量列是具有序列作为默认值的列。声明为标识列的列隐式地是此表的主键列(与自动增量列不同)。

所以对于H2,我需要使用AUTO_INCREMENT代替。

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

如果答案是肯定的,并且每个数据库的GENERATED AS IDENTITY都不同,那么是否有人知道如何为两个数据库使用相同的迁移脚本,或者这是不可能的?

谢谢!

sql oracle h2
1个回答
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)
);
© www.soinside.com 2019 - 2024. All rights reserved.