【发布时间】: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
我想做的是:
- 应删除
id列; -
uuid列应为主键; - 应该创建一个名为
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 会做正确的事情