我将创建一些输入到数据库中的对象。除自动递增主键外,无法保证其任何字段都是唯一的。我希望以后能够使用主键访问这些对象。
从数据库中获取此密钥的最佳方法是什么?在将对象的数据添加到数据库之后,我可以想到两种获取主键的方法:
这两个看起来都容易出错,而且我很想知道是否有更标准的方法。
答案 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代码查找它们的示例。
使用Statement
或PreparedStatement
对象中的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