使用java在oracle数据库中自动递增RowID

时间:2011-05-18 15:03:34

标签: java oracle prepared-statement

好吧我说我有一个有两列的表。 Entry_id和名称。 Entry_id是ROWID NOT NULL。 基本上我只是希望它在每次放入新内容时都会增加。我如何在PreparedStatement中执行此操作。我不会知道正确的Entry_id bc无关紧要。它应该每次都增加。因此,如果我可以将名称插入表中并且entry_id自动递增,那将是很好的。知道怎么做吗?

3 个答案:

答案 0 :(得分:8)

ROWID是表中行的物理地址。将ROWID用作键是没有意义的 - 如果将表从一个表空间移动到另一个表空间,如果执行导出和导入,如果发生行移动等,则ROWID将随时间而变化。等等有意义的是增加一个ROWID,因为结果很可能是无效的,因为它不再是实际行的物理地址,或者它不再是有效的物理地址。

如果要在Oracle中使用自动递增主键,则应将列声明为NUMBER,而不是ROWID。然后,您将创建一个序列对象

CREATE SEQUENCE entry_id_seq
  START WITH 1
  INCREMENT BY 1
  CACHE 100;

并在NEXTVAL声明

中引用该序列的INSERT
INSERT INTO entry( entry_id, name )
  VALUES( entry_id_seq.nextval, :1 );

当然,您可以创建一个before-insert触发器来填充序列

中的主键
CREATE OR REPLACE TRIGGER get_entry_id
  BEFORE INSERT ON entry
  FOR EACH ROW
IS
BEGIN
  SELECT entry_id_seq.nextval
    INTO :new.entry_id
    FROM dual;
END;

您的INSERT语句可以省略ENTRY_ID列,让触发器自动填充它。

INSERT INTO entry( name )
  VALUES( :1 );

答案 1 :(得分:3)

如果您对依赖数据库的方式感到满意,那么通常的方法是使用oracle sequence

创建生成数据库的序列后,您的代码将沿着

p = conn.prepareStatement("insert into mytable (entry_id, name) values (mysequence.next_val,?)");
p.setString(1,"My Name");
p.executeUpdate();

答案 2 :(得分:0)

我使用了关键字“oracle”和“autoincrement”。找到了这个:http://situsnya.wordpress.com/2008/09/02/how-to-create-auto-increment-columns-in-oracle/

通过将触发器与序列结合使用,您不需要在插入中包含特定于oracle的构造,只需将entry_id的值保留在插入中的显式值列表之外。