用于Java开发人员的Oracle数据库中的自动增量

Posted

技术标签:

【中文标题】用于Java开发人员的Oracle数据库中的自动增量【英文标题】:Auto increment in oracle database for java developer 【发布时间】:2016-12-15 20:38:58 【问题描述】:

我正在将数据库从 mysql 迁移到 Oracle 数据库,使用 SQL developer 作为迁移接口。我是 Oracle 的新手,我不确定这是否需要在 Oracle 中使用触发器进行重写,或者在 Oracle 中使用自动增量(如果存在)。

生成自动增量的迁移脚本后,下面是生成的 MySQL 触发代码:

CREATE OR REPLACE TRIGGER Trigger_name BEFORE INSERT ON Table_name
FOR EACH ROW
DECLARE 
v_newVal NUMBER(12) := 0;
v_incval NUMBER(12) := 0;
BEGIN
  IF INSERTING AND :new.table_PK_id IS NULL THEN
   SELECT  sequence_name.NEXTVAL INTO v_newVal FROM DUAL;
    IF v_newVal = 1 THEN 
     SELECT NVL(max(table_PK_id),0) INTO v_newVal FROM Table_name;
     v_newVal := v_newVal + 1;
     LOOP
       EXIT WHEN v_incval>=v_newVal;
       SELECT sequence_name.nextval INTO v_incval FROM dual;
     END LOOP;
  END IF;
 :new.table_PK_id := v_newVal;
END IF;
 END;

...这是在 Oracle 中生成的等效触发器:

CREATE OR REPLACE TRIGGER Trigger_name 
  BEFORE INSERT ON Table_name
  FOR EACH ROW
BEGIN
  SELECT sequence_name.nextval
  INTO :new.table_PK_id
  FROM dual;
END;

我应该在我的应用程序中使用 Oracle DDL 触发器代码,还是 Oracle 提供更好的东西?

【问题讨论】:

和这个问题类似,选择的答案可以解决你的问题:***.com/a/11296469/212950 是的,我从你提供给我@MAbraham1 的链接中得到了解决方案,我的问题是,如果我使用第二个触发器,我在编写插入语句时不必提及 id,对吧? 如果可行,请不要忘记标记我提供的答案。只需单击它旁边的复选框。谢谢。 我在我的项目中使用第二个,因为我们没有使用 oracle 12c。我不能使用身份。 是的,第二个应该可以正常工作。 【参考方案1】:

确定要迁移到哪个版本的 Oracle 非常重要,因为您可以利用 Oracle 提供的一些出色功能。相反,您可能会在将 MySQL 函数转换为 Oracle 过程时遇到困难,这取决于 Oracle 的早期版本。

例如,在 12.1 之前的 Oracle 版本中,没有提供自动增量,尽管它可以使用序列和触发器的组合来实现。因此,如果Oracle的版本是12.1或更高版本,我建议使用以序列伪列作为默认值的标识列,如下所示:

CREATE TABLE t1 (c1 NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY, 
                   c2 VARCHAR2(10));

您可以了解更多关于Identity Columns in Oracle Database 12c (12.1) 和here 的信息。

否则,如果 Oracle 早期版本,那么是的,您的触发代码是正确的,但您必须包含正确的表和列,类似于以下:

Table definition:

    CREATE TABLE departments (
      ID           NUMBER(10)    NOT NULL,
      DESCRIPTION  VARCHAR2(50)  NOT NULL);

    ALTER TABLE departments ADD (
      CONSTRAINT dept_pk PRIMARY KEY (ID));

    CREATE SEQUENCE dept_seq;

触发器定义:

   CREATE OR REPLACE TRIGGER dept_bir 
    BEFORE INSERT ON departments 
    FOR EACH ROW

    BEGIN
      SELECT dept_seq.NEXTVAL
      INTO   :new.id
      FROM   dual;
    END;
    /

请注意,此 SQL DDL 也可以在此处找到:How to create id with AUTO_INCREMENT on Oracle?

【讨论】:

到目前为止,我不确定我们使用的是哪个版本的数据库。这可能是旧的。这就是为什么我使用触发器来生成表的 id。

以上是关于用于Java开发人员的Oracle数据库中的自动增量的主要内容,如果未能解决你的问题,请参考以下文章

Oracle数据库的增删改,索引视图以及序列的创建和销毁

往oracle数据库中新增加一条数据如何自动生成ID

文件入库ORACLE自动化脚本

用于 Oracle 开发人员/dba 的 SQL 服务器

JDBC概述及JDBC完成对Oracle的增删改查

Oracle数据库之数据增删改