Oracle11g Liquibase createTable和autoIncrement列为Oracle 11g和12c生成不同的SQL

Oracle11g Liquibase createTable和autoIncrement列为Oracle 11g和12c生成不同的SQL,oracle11g,java-8,liquibase,oracle12c,Oracle11g,Java 8,Liquibase,Oracle12c,这是我的第一个问题,所以请温柔一点;-) 我们有一个具有以下变更集的liquibase项目: 启动使用Oracle 11g的应用程序时,创建的表如下所示: CREATE TABLE "SOMETHING"."TABLE_X" ( "ID" NUMBER(*,0) NOT NULL ENABLE, "INDSYNC" VARCHAR2(5 CHAR) NOT NULL ENABLE, "CODE" VARCHAR2(10 CHAR), "CODE_N" C

这是我的第一个问题,所以请温柔一点;-)

我们有一个具有以下变更集的liquibase项目:


启动使用Oracle 11g的应用程序时,创建的表如下所示:

  CREATE TABLE "SOMETHING"."TABLE_X" 
   (  "ID" NUMBER(*,0) NOT NULL ENABLE, 
   "INDSYNC" VARCHAR2(5 CHAR) NOT NULL ENABLE, 
   "CODE" VARCHAR2(10 CHAR), 
   "CODE_N" CHAR(1 CHAR) DEFAULT '2' NOT NULL ENABLE, 
   "DESCRIPTION" VARCHAR2(80 CHAR), 
   "DESCRIPTION_N" CHAR(1 CHAR) DEFAULT '2' NOT NULL ENABLE, 
    CONSTRAINT "TABLE_X_PK" PRIMARY KEY ("ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT)
  TABLESPACE "SOMETHING"  ENABLE
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT)
  TABLESPACE "SOMETHING" ;

   COMMENT ON TABLE "SOMETHING"."TABLE_X"  IS 'Groep';

  CREATE OR REPLACE TRIGGER "SOMETHING"."TABLE_X_BI" before insert on table_x for each row  WHEN (new.id is null) begin select table_x_seq.nextval into :new.id from dual; end;
/
ALTER TRIGGER "SOMETHING"."TABLE_X_BI" ENABLE;
 CREATE TABLE "SOMETHING"."TABLE_X" 
   (  "ID" NUMBER(*,0) GENERATED BY DEFAULT AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE  NOT NULL ENABLE, 
   "INDSYNC" VARCHAR2(5 CHAR) NOT NULL ENABLE, 
   "CODE" VARCHAR2(10 CHAR), 
   "CODE_N" CHAR(1 CHAR) DEFAULT '2' NOT NULL ENABLE, 
   "DESCRIPTION" VARCHAR2(80 CHAR), 
   "DESCRIPTION_N" CHAR(1 CHAR) DEFAULT '2' NOT NULL ENABLE, 
    CONSTRAINT "TABLE_X_PK" PRIMARY KEY ("ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SOMETHING"  ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SOMETHING" ;

   COMMENT ON TABLE "SOMETHING"."TABLE_X"  IS 'Groep';

  CREATE OR REPLACE EDITIONABLE TRIGGER "SOMETHING"."TABLE_X_BI" before insert on table_x for each row  WHEN (new.id is null) begin select table_x_seq.nextval into :new.id from dual; end;
/
ALTER TRIGGER "SOMETHING"."TABLE_X_BI" ENABLE;
这将按预期工作,sequence.nextval将插入到id列中。 但在启动使用Oracle 12c的应用程序时,创建的表如下所示:

  CREATE TABLE "SOMETHING"."TABLE_X" 
   (  "ID" NUMBER(*,0) NOT NULL ENABLE, 
   "INDSYNC" VARCHAR2(5 CHAR) NOT NULL ENABLE, 
   "CODE" VARCHAR2(10 CHAR), 
   "CODE_N" CHAR(1 CHAR) DEFAULT '2' NOT NULL ENABLE, 
   "DESCRIPTION" VARCHAR2(80 CHAR), 
   "DESCRIPTION_N" CHAR(1 CHAR) DEFAULT '2' NOT NULL ENABLE, 
    CONSTRAINT "TABLE_X_PK" PRIMARY KEY ("ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT)
  TABLESPACE "SOMETHING"  ENABLE
   ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT)
  TABLESPACE "SOMETHING" ;

   COMMENT ON TABLE "SOMETHING"."TABLE_X"  IS 'Groep';

  CREATE OR REPLACE TRIGGER "SOMETHING"."TABLE_X_BI" before insert on table_x for each row  WHEN (new.id is null) begin select table_x_seq.nextval into :new.id from dual; end;
/
ALTER TRIGGER "SOMETHING"."TABLE_X_BI" ENABLE;
 CREATE TABLE "SOMETHING"."TABLE_X" 
   (  "ID" NUMBER(*,0) GENERATED BY DEFAULT AS IDENTITY MINVALUE 1 MAXVALUE 9999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER  NOCYCLE  NOT NULL ENABLE, 
   "INDSYNC" VARCHAR2(5 CHAR) NOT NULL ENABLE, 
   "CODE" VARCHAR2(10 CHAR), 
   "CODE_N" CHAR(1 CHAR) DEFAULT '2' NOT NULL ENABLE, 
   "DESCRIPTION" VARCHAR2(80 CHAR), 
   "DESCRIPTION_N" CHAR(1 CHAR) DEFAULT '2' NOT NULL ENABLE, 
    CONSTRAINT "TABLE_X_PK" PRIMARY KEY ("ID")
  USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS 
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SOMETHING"  ENABLE
   ) SEGMENT CREATION IMMEDIATE 
  PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 
 NOCOMPRESS LOGGING
  STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
  PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
  BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
  TABLESPACE "SOMETHING" ;

   COMMENT ON TABLE "SOMETHING"."TABLE_X"  IS 'Groep';

  CREATE OR REPLACE EDITIONABLE TRIGGER "SOMETHING"."TABLE_X_BI" before insert on table_x for each row  WHEN (new.id is null) begin select table_x_seq.nextval into :new.id from dual; end;
/
ALTER TRIGGER "SOMETHING"."TABLE_X_BI" ENABLE;
12c创建的表的问题在于,序列的值永远不会用于列ID,因为它不会为null,因为“默认情况下生成为标识MINVALUE 1 MAXVALUE 99999999999999999999999增量为1 START with 1 CACHE 20 NOORDER NOCYCLE NOT null ENABLE”

id字段在每次插入时递增,但不使用序列

我的问题是,经过一段时间和几个变更集之后,我们擦除表_x的内容,删除序列并重新创建它以重新开始。 这在使用oracle 11g时非常有效,但在12c中则不行。12c中的id字段一直在增加,并且没有重置,这会在启动应用程序时导致问题

我需要做什么,才能在oracle 12c上拥有与11g相同的createTable定义

格尔茨

莱克斯

编辑1:我们使用的liquibase版本是3.4.2(maven dependency org.liquibase:liquibase核心)

编辑2:根据@SteveDonie的请求,${serial}定义如下:

<property name="serial" value="numeric(*,0)" dbms="oracle"/>
<property name="serial" value="serial" dbms="postgresql"/>
<property name="serial" value="int(10) UNSIGNED" dbms="mysql"/>


对于Oracle,两个版本只使用一个定义。

您是否尝试过ID字段的
defaultValueComputed
标记

<changeSet id="table_x_seq_create" author="takacsl">
    <createSequence cacheSize="2000" cycle="false" incrementBy="1" sequenceName="SEQ_TABLE_X" startValue="1"/>
</changeSet>
<changeSet id="table_x_create" author="takacsl">
  <createTable remarks="Groep" tableName="table_x">
    <column name="id" type="integer" defaultValueComputed="nextval('SEQ_TABLE_X')>
      <constraints primaryKey="true"  />
    </column>
    <column name="indsync" type="varchar(5)">
      <constraints nullable="false" />
    </column>
    <column name="code" type="varchar(10)" />
    <column defaultValue="2" name="code_n" type="char(1)">
      <constraints nullable="false" />
    </column>
    <column name="description" type="varchar(80)" />
    <column defaultValue="2" name="description_n" type="char(1)">
      <constraints nullable="false" />
    </column>
  </createTable>
</changeSet>


您的变更集提到了一个参数${serial}-这两个平台的设置是否不同?嗨@SteveDonie,我用请求的信息修改了这个问题。我在[here][1]中读到,12c中关于标识列的更改,但它也指出旧式的基于触发器的解决方案仍然有效,但性能较差。[1]: