Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用java实现oracle数据库中RowID的自动增量_Java_Oracle_Prepared Statement - Fatal编程技术网

用java实现oracle数据库中RowID的自动增量

用java实现oracle数据库中RowID的自动增量,java,oracle,prepared-statement,Java,Oracle,Prepared Statement,好吧,假设我有一个有两列的表。条目id和名称。条目\u id是一个ROWID,不为NULL。 本质上,我只是希望每次加入新的东西时它都会增加。如何在准备好的报表中执行此操作。我不知道正确的入口id,没关系。它应该每次都递增。因此,如果我可以将名称插入表中,并且条目id自动递增,那就太好了。知道怎么做吗?如果您对依赖数据库的方法感到满意,那么通常的方法是使用 创建序列后,该序列位于数据库中,您的代码将与 p = conn.prepareStatement("insert into mytable

好吧,假设我有一个有两列的表。条目id和名称。条目\u id是一个ROWID,不为NULL。
本质上,我只是希望每次加入新的东西时它都会增加。如何在准备好的报表中执行此操作。我不知道正确的入口id,没关系。它应该每次都递增。因此,如果我可以将名称插入表中,并且条目id自动递增,那就太好了。知道怎么做吗?

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

创建序列后,该序列位于数据库中,您的代码将与

p = conn.prepareStatement("insert into mytable (entry_id, name) values (mysequence.next_val,?)");
p.setString(1,"My Name");
p.executeUpdate();
我使用了关键词“oracle”和“autoincrement”。我们发现:


通过将触发器与序列结合使用,您不需要在insert中包含oracle特定的构造,只需将条目id的值从insert中的显式值列表中保留即可。

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

如果希望在Oracle中使用自动递增的主键,可以将列声明为数字,而不是ROWID。然后创建一个序列对象

CREATE SEQUENCE entry_id_seq
  START WITH 1
  INCREMENT BY 1
  CACHE 100;
并在
INSERT
语句中引用该序列的
NEXTVAL

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\u ID
列,让触发器自动填充它

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

所以,先在我的数据库中做一个序列,然后再做?是的,贾斯汀·凯夫的回答再往下一点,似乎给出了一个很好的例子,说明了如何做。