如何在oracle中自动调整ID值(主键)?

时间:2015-12-20 15:37:20

标签: java sql oracle

现在我已经创建了一个序列和一个触发器来自动递增ID值,如下所示:

CREATE OR REPLACE TRIGGER "RTH"."TBL_USER_TRIGGER" 
BEFORE INSERT ON TBL_USER
FOR EACH ROW
BEGIN
SELECT TBL_USER_SEQ.nextval
INTO :new.USR_ID
FROM dual;
END;

ALTER TRIGGER "RTH"."TBL_USER_TRIGGER" ENABLE;

假设我有三行:

User ID      FIRSTNAME     LASTNAME
====================================

1              John        smith
2              James       smith
3              Pat         smith

当我删除第一行(1)时,我希望ID值自动更正自己以纠正数字,以便第二行ID值变为1,第三行ID值变为2

在甲骨文有可能吗?或者我是通过代码完成的,因为我在用户提交表单时使用Java将记录插入表中。

Java DAO类:

public class RegistrationDAO {

    public void insert(User user) {

        try {            
            Connection con = DBConnection.getConnection();
            String query = "insert into TBL_USER(USR_FIRST_NAME,USR_LST_NAME,USR_PRIMARY_EMAIL,USR_PASSWORD) values(?,?,?,?)";
            PreparedStatement pst = con.prepareStatement(query);

            pst.setString(1, user.getFirstName());
            pst.setString(2, user.getLastName());
            pst.setString(3, user.getEmail());
            pst.setString(4, user.getPassword());
            pst.executeUpdate();
        } catch (Exception e) {
            System.out.println("@@@@Record insertion error in Registration DAO@@@@");
            System.out.println(e);
        }
    }
}

1 个答案:

答案 0 :(得分:2)

评论太长了。

简单的答案是:“不,你不想这样做。” id的目的是唯一标识每一行。顺序ID还具有提供插入顺序的功能。它无意随时间变化。第1行是第1行是第1行。

如果您想要订购,那么将id声明为主键并使用如下查询:

select t.*, row_number() over (order by usr_id) as seqnum
from t;