是否可以在 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 数据库文档中所述:

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

所以对于 H2,我需要改用AUTO_INCREMENT

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

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

谢谢!

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

相关内容

  • 没有找到相关文章

最新更新