提取自动递增主键的标准做法是什么?

时间:2013-12-25 05:59:29

标签: java mysql sql

我将创建一些输入到数据库中的对象。除自动递增主键外,无法保证其任何字段都是唯一的。我希望以后能够使用主键访问这些对象。

从数据库中获取此密钥的最佳方法是什么?在将对象的数据添加到数据库之后,我可以想到两种获取主键的方法:

  1. 找到最大主键,因为这是最近的主键 添加。
  2. 删除当前对象,将数据库中的数据与程序中的数据进行比较,然后根据程序中未包含的行创建新对象。
  3. 这两个看起来都容易出错,而且我很想知道是否有更标准的方法。

3 个答案:

答案 0 :(得分:1)

大多数数据库都有办法访问最后生成的ID,例如以SQL Server为例。

CREATE TABLE [SomeTable] (
    ID INT NOT NULL IDENTITY(1,1),
    FieldOne VARCHAR(MAX) NOT NULL,
    PRIMARY KEY(ID)
)

INSERT INTO [SomeTable](FieldOne) VALUES('a')

SELECT scope_identity() -- returns 1

INSERT INTO [SomeTable](FieldOne) VALUES('b')

SELECT scope_identity() -- returns 2

这具有对多个用户/交易安全的优势。

关于猜测下一个ID是什么的第一个建议在这方面是不安全的。

如果您有任何参照完整性或有任何触发因素,那么您的第二个建议将会造成严重破坏。

答案 1 :(得分:0)

看看

java.sql.Statement.executeUpdate(String sql, int autoGeneratedKeys) 

执行给定的SQL语句,并通过给定标志向驱动程序发出信号,告知该Statement对象生成的自动生成的密钥是否可用于检索。

答案 2 :(得分:0)

Java已经定义了一些方法来查找自动生成的键值,而不管您使用的SQL是什么。以下是如何使用Java代码查找它们的示例。

使用StatementPreparedStatement对象中的getGeneratedKeys()方法来识别新的自动生成值。迭代返回的ResultSet对象,以批处理语句的顺序获取新生成的键值。

如果您使用的JDBC驱动程序不支持此方法,则此调用可能会抛出java.sql.SQLFeatureNotSupportedException

示例代码段

String sql_insert =  
  "insert into my_table( non_auto_incrmnt_fld_names_,_separated ) " +  
  " values ( record1-values,cs-foreach-field ), "
  " ( record2-values,cs-foreach-field )"; // append as many as required  
...  
int rowsAffected = 
  stmtObject.executeUpdate( sql_insert, Statement.RETURN_GENERATED_KEYS );  
ResultSet rs = stmtObject.getGeneratedKeys();  

//******************************************************  
rs.last();  
int rows = rs.getRow();  
System.out.println( "Generated keys count: " + rows );  
//******************************************************/  

int currentRow = 1;  
rs.beforeFirst();  
while( rs.next() ) {  
    System.out.println( /**/( currentRow++ ) + " = " + /**/rs.getInt( 1 ) );  
} // while rs