`
最王座
  • 浏览: 140193 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Oracle通过触发器+序列实现自动增长

阅读更多

Oracle建立数据库表时,主键上无法加auto_increment,那么可以通过sequence和trigger来实现主键自动增长。

 

实现代码:

create table member(
memberId number primary key,
memberMail varchar2(20)not null,
memberName varchar2(20) not null,
memberPassword varchar2(20)
);

CREATE SEQUENCE emp_sequence
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXVALUE -- 不设置最大值
NOCYCLE -- 一直累加,不循环
NOCACHE; -- 不建缓冲区


create or replace trigger mem_trig before
insert on member for each row when (new.memberId is null)
begin
 
 select emp_sequence.nextval into:new.memberId from dual;
 
end;

 

通过执行如上sql脚本,可以达到目的。

测试代码:

 

insert into member(memberMail, memberName, memberPassword) values('2222@163.com', 'jack', '33333')
从上诉insert语句中可以看出,并没有给主键memberId赋值,那么它的值从哪里来呢?

 

因为前面我们为该表建立了触发器和序列,根据该触发器,当我们插入数据时,如果memberId为null,那么数据库会将序列emp_sequence.nextval的值作为主键memberId的值,最后执行插入操作。

 

注意问题1:

当你将上诉sql脚本拷贝到如:navicat的查询面板中执行时,千万不要执行[美化SQL]操作,如果执行了就是如下结果:

 

CREATE TABLE MEMBER (
	memberId NUMBER PRIMARY KEY,
	memberMail VARCHAR2 (20) NOT NULL,
	memberName VARCHAR2 (20) NOT NULL,
	memberPassword VARCHAR2 (20)
);

CREATE SEQUENCE emp_sequence INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXVALUE -- 不设置最大值
NOCYCLE -- 一直累加,不循环
NOCACHE;

-- 不建缓冲区
CREATE
OR REPLACE TRIGGER mem_trig BEFORE INSERT ON MEMBER FOR EACH ROW
WHEN (NEW .memberId IS NULL)
BEGIN
	SELECT
		emp_sequence.nextval INTO : NEW .memberId
	FROM
		dual ;
	END ;

 

反复的看,发现好像没有本质区别啊。但是请注意:emp_sequence.nextval INTO : NEW .memberId

其中INTO : NEW .memberId多了空格,这是错误的。

现在执行美化SQL之后的脚本,当执行create or replace...时,会出现如下错误:

[SQL]CREATE
OR REPLACE TRIGGER mem_trig BEFORE INSERT ON MEMBER FOR EACH ROW
WHEN (NEW .memberId IS NULL)
BEGIN
	SELECT
		emp_sequence.nextval INTO : NEW .memberId
	FROM
		dual ;
	END ;
[Err] ORA-24344: success with compilation error

这是编译错误,而导致该错误的原因就是美化SQL之后出现的空格,因此一定要注意。

 

注意问题2:

对于如下脚本:

 

CREATE OR REPLACE TRIGGER mem_trig BEFORE INSERT ON MEMBER FOR EACH ROW WHEN (NEW .memberId IS NULL)
BEGIN
	SELECT
		emp_sequence.nextval INTO : NEW .memberId
	FROM
		dual ;
END;

一定要注意,END后的分号";"绝对不可以省略,否则会出编译错误,如下所示:

ORA-24344: success with compilation error

因为这是pl/sql,语法必须严格。

又有人在java代码中通过jdbc测试没有加分号时发现,执行过程并没有报错啊。

 

package com.ssh.model;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

import org.junit.Test;

public class TestBeginEnd {

	@Test
	public void testBeginEnd() {
		Connection conn = DBUtil.getConnection();
		try {
			Statement stmt = conn.createStatement();

			String sql = "CREATE OR REPLACE TRIGGER trg_test_id \n" +

			"BEFORE INSERT ON test \n" +

			"FOR EACH ROW \n" +

			"WHEN (NEW.id IS NULL) \n" +

			"BEGIN \n" +

			"SELECT hibernate_sequence.nextval INTO :NEW.id FROM DUAL; \n" +

			"END";

			stmt.executeUpdate(sql);

			stmt.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

运行代码没有报任何的错误。但是这个让主键自动增长的触发器真的ok了吗?答案是否定的。

我们通过数据库客户端工具,连接上数据库,看到触发器上有红色的叹号,说明该触发器是有问题的。

怎么测试该触发器有问题呢?往test表中插入一条数据即可:test表有id, name字段,其中id number(19, 0) primary key.

insert into test(name) values('张三');

执行,报错:

[SQL]insert into test(name) values('张三')

[Err] ORA-04098: trigger 'YTKJ.TRG_TEST_ID' is invalid and failed re-validation

说明该触发器时有问题的。把分号加上,再测试ok。

 

综上所述,END后的分号绝对不可以少。

  • 大小: 4.5 KB
分享到:
评论

相关推荐

    oracle通过触发器,实现序列自增

    ### Oracle通过触发器实现序列自增 在Oracle数据库中,序列是一种非常实用的对象,它可以用于自动产生唯一的数值。本文将详细介绍如何通过触发器与序列相结合的方式,在Oracle数据库中实现记录的自增功能。 #### ...

    oracle触发器实现主键自动增长

    总之,通过Oracle的触发器和序列,我们可以轻松地实现主键的自动增长,这不仅简化了数据管理流程,也提高了数据的一致性和安全性。然而,在具体应用中,还需根据实际业务需求和系统环境,合理设计和优化触发器与序列...

    oracle 触发器方式实现行ID自增加

    本文将深入探讨如何使用Oracle触发器来实现行ID的自增加。 首先,我们得了解什么是触发器。在Oracle中,触发器是一种数据库对象,它可以在特定的数据库操作(如INSERT、UPDATE或DELETE)发生时自动执行预先定义的...

    创建Oracle触发器用于表中序列值自增长(Helloblock写作)

    ### 创建Oracle触发器用于表中序列值自增长 在Oracle数据库中,为了实现表中某个字段的自动递增功能,通常会使用序列(sequence)结合触发器(trigger)的方式来完成。这种方式不仅能够确保数据的一致性和完整性,...

    oracle 创建触发器 创建序列.txt

    oracle 创建序列 完整步骤

    oracle中用序列实现自动增长值

    在Oracle数据库系统中,与SQL Server中的`IDENTITY`特性类似,我们可以通过使用序列(Sequences)来实现字段的自动增长值。序列是一种特殊的数据库对象,它可以生成一系列有序的数值,通常用于为表的主键字段提供...

    oracle快速批量生成表和触发器和序列.zip

    3. **序列(Sequence)**:Oracle序列是一种自增数字生成器,常用于生成唯一的ID,尤其是在没有自动增长字段的表中。使用`CREATE SEQUENCE`语句可以创建序列,可以指定初始值、增长步长、是否循环等属性。批量生成...

    调试oracle触发器方法

    调试Oracle触发器是开发和维护数据库应用程序时的重要步骤,可以帮助我们找出潜在的错误和逻辑问题。下面我们将详细探讨如何调试Oracle触发器。 1. **PL/SQL Developer工具调试**: - PL/SQL Developer是一款强大...

    Oracle自增序列和触发器生成工具.zip

    Oracle数据库在设计关系型数据库时,常常需要使用到自增序列和触发器来实现自动增长的主键。自增序列可以确保数据的唯一性,而触发器则可以在特定事件(如INSERT、UPDATE或DELETE)发生时执行一些额外的操作。本...

    oracle 增加序列 触发器 全过程

    oracle 增加序列 触发器 全过程 sql文件只需更换表名

    详解Oracle序列和触发器的使用

    在实际应用中,序列和触发器通常结合使用来实现自动递增的主键。例如,如果你有一个名为A的表,其ID字段作为主键,你可以先创建一个序列SEQ_A,然后创建一个触发器TRG_A,确保每当有新数据插入表A时,ID字段都能自动...

    oracle设置主外键即主键序列自动增长

    下面将详细介绍如何在Oracle中创建包含主键和外键的表,并利用触发器(Trigger)和序列实现主键的自动增长。 #### 一、创建包含主键和外键的表 首先,我们来看一下创建包含主键和外键的表的基本语法和步骤。 ####...

    如何实现Oracle自增,序列,触发器都有

    在Oracle数据库中实现主键自增功能可以通过创建序列(sequence)与触发器(trigger)相结合的方式实现。这种方式不仅能够确保数据表中的主键唯一性,还能自动递增,极大地简化了开发人员的工作。 #### 创建Sequence...

    Oracle 使用触发器创建自动序列号

    --建表 drop table TEST create table TEST ...--测试 insert条语句将会自动生成自定义主键,即插入其他字段,主键在插入记录前自动生成 insert into test(test1) values('bbb'); select * from test;

    powerdesigner创建oracle_数据库表,设置表主键列为自动增长

    为了实现主键的自动增长功能,我们需要通过创建一个序列(sequence)来实现这一目标。 1. **在表视图中设置:** - 双击表视图,打开`Table Properties`对话框。 - 转到`Columns`选项卡,选择要作为主键的列。 - ...

    oracle数据库字段值自动加1

    Oracle 数据库字段值自动加 1 可以通过创建表、序列和触发器来实现。在实际应用中,需要根据具体情况选择合适的实现方式。 需要注意的是,在创建触发器时,需要指定触发器的名称、表名称、序列名称和列名称等信息。...

    oracle触发器语法要点

    Oracle触发器是一种存储过程,它在特定的数据库事件(如INSERT、UPDATE或DELETE)发生时自动执行。触发器可以用于实施复杂的业务规则、数据完整性检查或者自动生成某些值。它们是在数据库级别上执行的,并且可以根据...

    如何为oracle中的表增加自动增长列.pdf

    所以,正确地设置序列和触发器是实现自动增长列的关键。 此外,Oracle数据库从12c版本开始支持IDENTITY属性,这是一种更为简便的方法来实现自动增长列,可以直接在列定义时指定。IDENTITY属性可以确保列的值是唯一...

    oracle建触发器与创建递增字段

    在Oracle数据库中,为了实现自动递增的功能,我们通常会使用`SEQUENCE`对象来实现这一目标。序列(SEQUENCE)是Oracle提供的用于生成一系列唯一数值的对象,非常适合用作表中的主键值或其他唯一标识符。 ##### 创建...

    oracle主键自动增长

    #### 三、结合序列和触发器实现自动增长 通过上述步骤,我们可以实现表中主键的自动增长。具体步骤如下: 1. **创建序列**:根据需求创建合适的序列对象。 2. **创建触发器**:编写触发器,在插入数据前自动获取...

Global site tag (gtag.js) - Google Analytics