提取自增主键的标准做法是啥?

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 代码查找它们的示例。

使用StatementPreparedStatement 对象中的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  

【讨论】:

以上是关于提取自增主键的标准做法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

mysql自增主键怎么用

自增主键为什么会不连续

如何修改mysql主键的值为自增

Mybatis批量插入返回自增主键(转)

mybatis 自增主键配置

PostgreSQL自增主键的用法以及在mybatis中的使用