Orcal实现主键自动递增

本文介绍了如何在Oracle数据库中通过创建序列和触发器来实现在插入数据时主键自动递增的功能。首先创建一个名为SM_AFTERSALE_EBOARD_seq的序列,设置初始值为200并按1递增,无最大值且不缓存。接着创建名为TRIG_SM_AFTERSALE_EBOARD的触发器,在SM_AFTERSALE_EBOARD表的插入操作前,将序列的下一个值赋给主键字段EBOARD_ID。此外,还提供了查看当前用户所有序列的SQL查询,并提示可以在SQL Developer中直接新建序列。

通过序列和触发器,实现插入时主键的自动递增

/**
* 先执行创建序列的语句,再执行创建触发器的语句
*/
create sequence SM_AFTERSALE_EBOARD_seq //SM_AFTERSALE_EBOARD_seq 为序列名称
increment by 1  //每次增加1
start with 200  //从200开始
nomaxvalue      //无最大值
nocache;        //不循环

create or replace TRIGGER TRIG_SM_AFTERSALE_EBOARD  //TRIG_SM_AFTERSALE_EBOARD 为触发器名
before insert on SM_AFTERSALE_EBOARD                //SM_AFTERSALE_EBOARD 为表名
for each row
begin
select SM_AFTERSALE_EBOARD_seq.nextval into :new.EBOARD_ID from dual; //EBOARD_ID 为主键名
end;

注意:orcale 的序列并不是专属于某一个表的,我们可以通过以下命令查看当前用户创建的所有序列

select * from user_sequences; 

查询数据库中序列

sqldeveloper 也可以直接在这里右键,新建序列

在这里插入图片描述

触发器是属于表的

在这里插入图片描述

### Oracle 数据库中带有主键的 INSERT 语句示例 在 Oracle 数据库中,可以通过序列(Sequence)或触发器(Trigger)生成主键值。以下是几种常见的实现方式: #### 方法一:使用序列(Sequence)和 `INSERT` 语句 可以创建一个序列对象,并在 `INSERT` 语句中引用该序列生成主键值。 ```sql -- 创建序列 CREATE SEQUENCE TESTSEQ START WITH 1 INCREMENT BY 1; -- 入数据并使用序列生成主键 INSERT INTO TESTTABLE (ID, NAME) VALUES (TESTSEQ.NEXTVAL, 'aaaa'); ``` 这种方法需要手动在 SQL 中调用序列[^1]。 #### 方法二:使用 `RETURNING` 子句获取入后的主键值 通过 `RETURNING` 子句可以在入数据后直接获取生成的主键值。 ```sql DECLARE v_id NUMBER; BEGIN INSERT INTO TESTTABLE (ID, NAME) VALUES (TESTSEQ.NEXTVAL, 'aaaa') RETURNING ID INTO v_id; DBMS_OUTPUT.PUT_LINE('Inserted ID: ' + TO_CHAR(v_id)); END; ``` 此方法适用于 PL/SQL 环境[^2]。 #### 方法三:使用 JDBC 获取生成的主键值 在 Java 应用程序中,可以通过 JDBC 的 `PreparedStatement` 和 `Statement.RETURN_GENERATED_KEYS` 参数来获取入后生成的主键值。 ```java String sql = "INSERT INTO TESTTABLE (ID, NAME) VALUES (?, ?)"; String generatedColumns[] = { "ID" }; PreparedStatement pstmt = conn.prepareStatement(sql, generatedColumns); pstmt.setInt(1, TESTSEQ.NEXTVAL); // 假设通过其他方式获取序列值 pstmt.setString(2, "aaaa"); pstmt.executeUpdate(); ResultSet rs = pstmt.getGeneratedKeys(); if (rs.next()) { int id = rs.getInt(1); System.out.println("Generated Key: " + id); } ``` 这种方法允许应用程序动态获取生成的主键值[^3]。 #### 方法四:结合触发器自动生成主键 如果希望数据库自动为每条记录生成主键,可以创建一个触发器,在入时自动设置主键值。 ```sql -- 创建序列 CREATE SEQUENCE TESTSEQ START WITH 1 INCREMENT BY 1; -- 创建触发器 CREATE OR REPLACE TRIGGER TESTTABLE_TRIGGER BEFORE INSERT ON TESTTABLE FOR EACH ROW BEGIN SELECT TESTSEQ.NEXTVAL INTO :NEW.ID FROM DUAL; END; -- 入数据时无需指定主键 INSERT INTO TESTTABLE (NAME) VALUES ('aaaa'); ``` 触发器会自动主键字段赋值,简化了入操作[^4]。 --- ### 注意事项 - 如果主键是字符串类型(如 `VARCHAR2`),需要确保序列生成的值符合主键字段的数据类型。 - 使用 `RETURNING` 子句时,目标字段必须是可更新的列。 - 在 JDBC 中,`getGeneratedKeys()` 方法返回的结果集可能为空,需检查是否成功入数据。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值