【问题标题】:Is it possible to create an identity column in Oracle without it being a primary key, and how does it relate to H2 Database?是否可以在 Oracle 中创建一个标识列而不作为主键,它与 H2 数据库有什么关系?
【发布时间】:2019-02-16 04:31:55
【问题描述】:

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

-- 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 中所指出的那样:

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

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

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

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

谢谢!

【问题讨论】:

  • 如何为两个数据库使用相同的迁移脚本”使用 Liquibase 及其“朴素”的 XML 格式(而不是“普通 SQL”)。将列定义为autoincrement,Liquibase 会做正确的事情

标签: sql oracle h2


【解决方案1】:

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

【讨论】:

  • @MagnoNascimento:这就是为什么你应该每个问题只问一个问题的原因。
  • 与 Oracle 相比,H2 是一个完全不同的数据库。
  • “H2 Oracle 模式”与 Oracle 有 一些 相似之处,但只有少数相似之处。它不会——无论如何——模仿甲骨文。 Oracle 有很多你不应该期望在 H2 中看到的特性。他们的行为完全不同。为什么你首先需要这个?如果您想要完全兼容 Oracle,那么只需在本地或 Web 上安装 Oracle。它们是免费的。
  • 这是一个 [非常] 个人的建议:使用 Oracle,它对开发是免费的。我已经看到我最亲爱的一位朋友实施了您的策略。几年后,他放弃了。这两个数据库是如此不同,您的策略仅适用于 CRUD 级 SQL,甚至不适用于纯 SQL,但仅限于 1990 年代的 SQL。如果您需要 2000 年代的性能或任何功能,则此策略行不通。例如,需要 CTE 吗?在 H2 中不可用。窗口功能?没有。约束可延期性?没有;横向连接?不。表达式的索引?没有。部分索引?没有。集群索引?也不是。
  • 刚刚更新,我为 H2 创建的票证已经解决和合并,它可能会出现在下一个版本中。感谢您的支持!
猜你喜欢
  • 1970-01-01
  • 2016-03-23
  • 2021-04-04
  • 2014-02-10
  • 1970-01-01
  • 2011-06-27
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
相关资源
最近更新 更多