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