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后的分号绝对不可以少。
相关推荐
### Oracle通过触发器实现序列自增 在Oracle数据库中,序列是一种非常实用的对象,它可以用于自动产生唯一的数值。本文将详细介绍如何通过触发器与序列相结合的方式,在Oracle数据库中实现记录的自增功能。 #### ...
总之,通过Oracle的触发器和序列,我们可以轻松地实现主键的自动增长,这不仅简化了数据管理流程,也提高了数据的一致性和安全性。然而,在具体应用中,还需根据实际业务需求和系统环境,合理设计和优化触发器与序列...
本文将深入探讨如何使用Oracle触发器来实现行ID的自增加。 首先,我们得了解什么是触发器。在Oracle中,触发器是一种数据库对象,它可以在特定的数据库操作(如INSERT、UPDATE或DELETE)发生时自动执行预先定义的...
### 创建Oracle触发器用于表中序列值自增长 在Oracle数据库中,为了实现表中某个字段的自动递增功能,通常会使用序列(sequence)结合触发器(trigger)的方式来完成。这种方式不仅能够确保数据的一致性和完整性,...
oracle 创建序列 完整步骤
在Oracle数据库系统中,与SQL Server中的`IDENTITY`特性类似,我们可以通过使用序列(Sequences)来实现字段的自动增长值。序列是一种特殊的数据库对象,它可以生成一系列有序的数值,通常用于为表的主键字段提供...
3. **序列(Sequence)**:Oracle序列是一种自增数字生成器,常用于生成唯一的ID,尤其是在没有自动增长字段的表中。使用`CREATE SEQUENCE`语句可以创建序列,可以指定初始值、增长步长、是否循环等属性。批量生成...
调试Oracle触发器是开发和维护数据库应用程序时的重要步骤,可以帮助我们找出潜在的错误和逻辑问题。下面我们将详细探讨如何调试Oracle触发器。 1. **PL/SQL Developer工具调试**: - PL/SQL Developer是一款强大...
Oracle数据库在设计关系型数据库时,常常需要使用到自增序列和触发器来实现自动增长的主键。自增序列可以确保数据的唯一性,而触发器则可以在特定事件(如INSERT、UPDATE或DELETE)发生时执行一些额外的操作。本...
oracle 增加序列 触发器 全过程 sql文件只需更换表名
在实际应用中,序列和触发器通常结合使用来实现自动递增的主键。例如,如果你有一个名为A的表,其ID字段作为主键,你可以先创建一个序列SEQ_A,然后创建一个触发器TRG_A,确保每当有新数据插入表A时,ID字段都能自动...
下面将详细介绍如何在Oracle中创建包含主键和外键的表,并利用触发器(Trigger)和序列实现主键的自动增长。 #### 一、创建包含主键和外键的表 首先,我们来看一下创建包含主键和外键的表的基本语法和步骤。 ####...
在Oracle数据库中实现主键自增功能可以通过创建序列(sequence)与触发器(trigger)相结合的方式实现。这种方式不仅能够确保数据表中的主键唯一性,还能自动递增,极大地简化了开发人员的工作。 #### 创建Sequence...
--建表 drop table TEST create table TEST ...--测试 insert条语句将会自动生成自定义主键,即插入其他字段,主键在插入记录前自动生成 insert into test(test1) values('bbb'); select * from test;
为了实现主键的自动增长功能,我们需要通过创建一个序列(sequence)来实现这一目标。 1. **在表视图中设置:** - 双击表视图,打开`Table Properties`对话框。 - 转到`Columns`选项卡,选择要作为主键的列。 - ...
Oracle 数据库字段值自动加 1 可以通过创建表、序列和触发器来实现。在实际应用中,需要根据具体情况选择合适的实现方式。 需要注意的是,在创建触发器时,需要指定触发器的名称、表名称、序列名称和列名称等信息。...
Oracle触发器是一种存储过程,它在特定的数据库事件(如INSERT、UPDATE或DELETE)发生时自动执行。触发器可以用于实施复杂的业务规则、数据完整性检查或者自动生成某些值。它们是在数据库级别上执行的,并且可以根据...
所以,正确地设置序列和触发器是实现自动增长列的关键。 此外,Oracle数据库从12c版本开始支持IDENTITY属性,这是一种更为简便的方法来实现自动增长列,可以直接在列定义时指定。IDENTITY属性可以确保列的值是唯一...
在Oracle数据库中,为了实现自动递增的功能,我们通常会使用`SEQUENCE`对象来实现这一目标。序列(SEQUENCE)是Oracle提供的用于生成一系列唯一数值的对象,非常适合用作表中的主键值或其他唯一标识符。 ##### 创建...
#### 三、结合序列和触发器实现自动增长 通过上述步骤,我们可以实现表中主键的自动增长。具体步骤如下: 1. **创建序列**:根据需求创建合适的序列对象。 2. **创建触发器**:编写触发器,在插入数据前自动获取...