java 开发人员在 oracle 数据库中自动递增
Auto increment in oracle database for java developer
我正在将数据库从 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 提供更好的东西?
确定要迁移到哪个版本的 Oracle 非常重要,因为您可能会利用 Oracle 提供的一些强大功能。相反,您可能会在将 MySQL 函数转换为 Oracle 过程时遇到困难,这可能具有挑战性,具体取决于 Oracle 的早期版本。
例如,在Oracle 12.1之前的版本中,没有提供自动增量,尽管它可以使用序列和触发器的组合来实现。因此,如果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) and here 的更多信息。
否则,如果 Oracle 是 早期版本,那么是的,您的触发代码是正确的,但您必须包含正确的 table 和列,类似于以下内容:
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?
我正在将数据库从 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 提供更好的东西?
确定要迁移到哪个版本的 Oracle 非常重要,因为您可能会利用 Oracle 提供的一些强大功能。相反,您可能会在将 MySQL 函数转换为 Oracle 过程时遇到困难,这可能具有挑战性,具体取决于 Oracle 的早期版本。
例如,在Oracle 12.1之前的版本中,没有提供自动增量,尽管它可以使用序列和触发器的组合来实现。因此,如果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) and here 的更多信息。
否则,如果 Oracle 是 早期版本,那么是的,您的触发代码是正确的,但您必须包含正确的 table 和列,类似于以下内容:
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?