删除查询后更新自动编号字段
Posted
技术标签:
【中文标题】删除查询后更新自动编号字段【英文标题】:Update Autonumber field after DELETE query 【发布时间】:2014-04-11 23:21:17 【问题描述】:简介及相关资料:
我有 MS ACCESS 2007 数据库,我使用 ADO 和 C++ 进行编辑。
问题:
我的问题是主键也代表了记录的序数,删除后应该适当更新。主键是自动编号类型。
这是我所说的一个例子:
| #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 > ? );
一切似乎都运行良好。我希望有一个更简单的方法...
感谢大家的帮助。我对所有答案都投了赞成票。
【讨论】:
以上是关于删除查询后更新自动编号字段的主要内容,如果未能解决你的问题,请参考以下文章
在sql数据库,我插入一条数据有误,编号错了,和前面的重复,要怎么修改呢?