自动递增主键值始终为 0

Posted

技术标签:

【中文标题】自动递增主键值始终为 0【英文标题】:Auto increment primary key value is always 0 【发布时间】:2018-08-09 09:37:01 【问题描述】:

我正在尝试使用以下代码向数据库添加新行。

尽管Rundef 表有一个应该自动递增的主键,但它的值始终为零。为什么会这样?

Private oRunDefDS As DataSet
Dim oDR As DataRow = oRunDefDS.Tables("RunDef").NewRow()

Rundef 表的设计:

【问题讨论】:

您能展示一下您的特定桌子的设计吗?自动增量(SQL Server 中的标识)设置不正确是合理的。 @DKyleo 我已经更新了这个问题。希望它有所帮助 好的,在Column Properties中打开你的RunID列的Identity Specification,查看是列为Yes还是No。 除非您插入了默认值或绑定 0,否则您的身份密钥应该可以工作。 您是在将记录保存到数据库之前还是之后查看 RunID? 【参考方案1】:

当您在代码中创建一个新行时,它还没有被插入到数据库中。这意味着数据库引擎没有分配它的增量 ID,而是给它一个默认值 0。

将记录插入数据库,id 应该会自动更新,但您可能需要重新读取该行以取回数据,具体取决于您使用的数据访问权限。

如果不是这种情况,那么您的代码可以创建许多仅供内部使用的新行,但需要对所使用的 ID 进行保留。如果您从未将这些新行保存到数据库中,您最终会在增量 ID 中出现很多空白。

【讨论】:

您的意思可能是insertedCommit 在谈论数据库时总是指事务 我认为 NewRow() 应该自己初始化 Id 字段吧? 正确,但 NewRow 对象仅在内存中,不在数据库中。只有在保存时才会应用增量 ID。 @MuhammedThabjeel 不,这只是 DataTable 的行构造函数,它可能与数据库没有任何关系*。标识值由数据库生成,而不是代码 @MuhammedThabjeel 绝对不是。也许有一些自定义代码会在插入之前修改内容。或者,当您有具有关系的数据表时,使用 值,为相关记录提供临时 ID。将数据集保存到数据库时,这些值将替换为真实值

以上是关于自动递增主键值始终为 0的主要内容,如果未能解决你的问题,请参考以下文章

主键生成策略

phpmyadmin 自动递增主键行为奇怪

oracle的主键要设置默认值为自动递增,怎么处理?

将主键更改为自动递增

innodb 存储引擎为啥要用一个自增的主键

在oracle 怎样设置自动递增的的字段,也就是设置自动递增的ID 主键