DELETE查询后更新自动编号字段

Update Autonumber field after DELETE query

本文关键字:编号 字段 更新 查询 DELETE      更新时间:2023-10-16

简介和相关信息:

我有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更新字段

谢谢。

致以最良好的问候。

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

编辑回答您的问题:

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

如果您将其设置为autonumber,它将自动递增,但您将无法修改它。您可以将其设置成number,当您插入时,您可以使用SELECT MAX(oredinal) + 1 FROM mytable来递增它。

对于MS Access,请使用

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

对于Sql Server

DBCC CHECKIDENT (orders, RESEED, 0)

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

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

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

如果我们假设字段名为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 > ?  );

一切似乎都很顺利。我希望有一个更简单的方法。。。

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