提取自增主键的标准做法是啥?
Posted
技术标签:
【中文标题】提取自增主键的标准做法是啥?【英文标题】:What is the standard practice for extracting an auto-incrementing primary key?提取自增主键的标准做法是什么? 【发布时间】:2013-12-25 05:59:29 【问题描述】:我有一些对象将被创建并输入到数据库中。除了自动递增的主键外,不能保证它们的任何字段都是唯一的。我希望以后能够在程序中使用它们的主键访问这些对象。
从数据库中获取此密钥的最佳方法是什么?将对象的数据添加到数据库后,我可以想到两种获取主键的方法:
-
找到最大的主键,因为这是最近的主键
添加。
删除当前对象,将数据库中的数据与程序中的数据进行比较,然后根据程序中不包含的行创建一个新的对象。
这两种方法似乎都容易出错且很笨拙,我想知道是否有更标准的方法来做到这一点。
【问题讨论】:
SELECT LAST_INSERT_ID()的可能重复 【参考方案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 是什么的第一个建议在这方面并不安全。
如果您有任何参照完整性或有任何触发器,您的第二个建议将会破坏。
【讨论】:
【参考方案2】:看看
java.sql.Statement.executeUpdate(String sql, int autoGeneratedKeys)
执行给定的 SQL 语句,并用给定的标志向驱动程序发送此 Statement 对象生成的自动生成的键是否可用于检索的信号。
【讨论】:
【参考方案3】:Java 定义了查找自动生成的键值的方法,而与您使用的 SQL 无关。以下是有关如何使用 Java 代码查找它们的示例。
使用Statement
或PreparedStatement
对象中的getGeneratedKeys()
方法来识别新的自动生成值。迭代返回的ResultSet
对象,按照批处理语句的顺序获取新生成的键值。
如果您使用的 JDBC 驱动程序不支持此方法,此调用可能会抛出 java.sql.SQLFeatureNotSupportedException
。
示例代码 sn-p:
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
【讨论】:
以上是关于提取自增主键的标准做法是啥?的主要内容,如果未能解决你的问题,请参考以下文章