删除查询后更新自动编号字段

Posted

技术标签:

【中文标题】删除查询后更新自动编号字段【英文标题】:Update Autonumber field after DELETE query 【发布时间】:2014-04-11 23:21:17 【问题描述】:

简介及相关资料:

我有 MS ACCESS 2007 数据库,我使用 ADOC++ 进行编辑。

问题:

我的问题是主键也代表了记录的序数,删除后应该适当更新。主键是自动编号类型

这是我所说的一个例子:

| #PK | Other data ... |
|  1  |      ...       |
|  2  |      ...       |
|  3  |      ...       |
|  4  |      ...       |
|  5  |      ...       |

现在如果我删除第三条记录,我会遇到以下问题:

| #PK | Other data ... |
|  1  |      ...       |
|  2  |      ...       |
|  4  |      ...       |
|  5  |      ...       |

但我应该得到以下结果:

| #PK | Other data ... |
|  1  |      ...       |
|  2  |      ...       |
|  3  |      ...       | // edited to reflect the change ( previous value was 4 )
|  4  |      ...       | // edited to reflect the change ( previous value was 5 )

如果我删除最后一条记录,然后插入新记录,我会得到以下结果:

| #PK | Other data ... |
|  1  |      ...       |
|  2  |      ...       |
|  3  |      ...       |  
|  4  |      ...       | 
|  6  |      ...       |  // this should be 5

问题:

在我执行DELETE query 之后,我有没有办法以编程方式更新自动编号字段

编辑:

由于我知道这是一种不好的做法,我更愿意添加应该是序数的新字段,以便我的表格看起来像这样:

| #PK | Ordinal | Other data ... |
|  1  |    1    |      ...       |
|  2  |    2    |      ...       |
|  4  |    3    |      ...       |  
|  5  |    4    |      ...       | 

但我希望它自动更新。如果这是不可能的,我宁愿在执行删除后用SQL query 更新该字段。

谢谢。

最好的问候。

【问题讨论】:

【参考方案1】:

这是可能的,但不是正确的方法。主键用于关系,因此如果更改值,则需要更新所有相关表。即使您目前没有任何相关的表,您仍然应该考虑为订单添加一个单独的字段,否则您将来在添加相关表时可能会遇到同样的问题。

编辑回答您的问题:

有没有办法添加另一个字段来表示序数并在插入新记录后自动递增?

如果您将其设置为自动编号,它将自动递增,但您将无法修改它。您可以将其设置为数字,并在插入时使用SELECT MAX(oredinal) + 1 FROM mytable 将其递增。

【讨论】:

既然我同意你的观点,我请求你帮助我完成我的第二种方法。有没有办法添加另一个表示序数的字段并在插入新记录后自动递增?这样我就可以在执行删除后更新此字段。谢谢。最好的问候。 请不要使用Max获取下一个序号,在多用户系统中很可能导致重复。您将需要一个可以锁定的种子表以获取下一个数字。这是一个 VBA 示例***.com/questions/11949603/…【参考方案2】:

对于 MS Access 使用

ALter Table Customer alter column CustomerID Counter(1,1)

对于 Sql 服务器

DBCC CHECKIDENT (orders, RESEED, 0)

这会将下一个ID的值设置为1,你可以使用上面的命令。

参考网址@http://www.howtogeek.com/howto/database/reset-identity-column-value-in-sql-server/

【讨论】:

【参考方案3】:

我决定在我的表中添加一个新字段来保存记录的序号。

如果我们假设该字段名为 OrdinalNumber,那么以下解决方案对我有用:

// when inserting record, I just had to add COUNT( PK ) + 1
INSERT INTO MyTable (  OrdinalNumber , ... ) SELECT COUNT( PK ) + 1 , ...  
    from  MyTable ;

// when deleting, I had to perform following two queries :
DELETE from MyTable where PK = ? ;

// decrement all the successors ordinal number by one
UPDATE MyTable set OrdinalNumber = (  OrdinalNumber - 1 ) where ( PK > ?  );

一切似乎都运行良好。我希望有一个更简单的方法...

感谢大家的帮助。我对所有答案都投了赞成票。

【讨论】:

以上是关于删除查询后更新自动编号字段的主要内容,如果未能解决你的问题,请参考以下文章

自动编号字段有重复项

使用 angular.js 按自动编号字段删除记录

SQL server怎么在更新数据的时候让字段自动加1,

在sql数据库,我插入一条数据有误,编号错了,和前面的重复,要怎么修改呢?

如何让SELECT 查询结果额外增加自动递增序号sqlserver

oracle 查询不连续的值?