2009-12-17 89 views
1

我有一个访问表,其中包含自动主键,日期和其他数据。由于删除记录,第一条记录开始于36。我想要更改所有主键,以便从1开始并按日期排序。什么是最好的方法来做到这一点?将访问表中的所有主键更改为新数字

我想表从:

| TestID | Date  | Data | 
| 36 | 12/02/09 | .54 | 
| 37 | 12/04/09 | .52 | 

要这样:

| TestID | Date  | Data | 
| 1  | 12/02/09 | .54 | 
| 2  | 12/04/09 | .52 | 

编辑:感谢您的输入和那些谁回答。我认为有些人对我的问题有点太多了,这可以,因为这还会增加我的学习和思考过程。我的问题的目的是两方面:1)与我的数据的日期顺序匹配PK匹配更好,2)了解这样的事情是否可以用于以后使用。比如,如果我想在表中添加一个新的列来为测试编号,为测试类型添加标签等等。我现在想马上学习很多东西,所以我有时候会有点困惑。我正在构建.NET应用程序,并试图学习SQL和数据库管理,有时会发现使用不同的RDMS以及与它们进行交互的方式找到正确的信息时会感到困惑。

+5

是否真的重要到最终用户什么ID是什么? – 2009-12-17 22:19:50

+2

是否有任何特定的业务原因来更改主键?这只是一个任意数字。 – HardCode 2009-12-17 22:20:10

+3

是否有任何引用要更新的主键的外键? – 2009-12-17 22:20:14

回答

3

从MikeW之后,你可以使用下面的SQL命令来从旧的数据复制到新表:

​​3210

新TestID将从1,如果您使用自动递增场开始。

3

我会用自动增量创建一个新表。

然后选择所有现有的数据,按日期排序。这将导致ID从“1”重新创建。

然后您可以删除原始表格,并重新命名新的表格。

假设没有外键 - 如果是这样,你必须删除并重新创建这些键。

+0

这似乎是最简单的方法。但为了教育目的,我将如何循环使用计数器来更改每个表格? – ScottK 2009-12-17 22:25:22

+0

见上文。 ------- – martinr 2009-12-17 22:33:59

+1

最好的方法(原问题)不是,但如果你必须,MikeW是下一个最好的方法。请更新您的问题,如果你想最好的方式来做一个循环。闻起来像一个家庭作业问题。 – 2009-12-17 22:35:29

2

用作代理主键的自动编号不是数据,但元数据用于除了连接相关表中的记录外什么也不做。如果您需要控制该字段中的值,那么它是数据,并且您不能使用自动编号,但必须滚动自己的自动增量例程。你可能想看看this thread作为一个起点,但是在Access中使用的代码在任何地方都是可用的。Access程序员聚集在Net上。

0

我同意自动生成的IDENTITY值的值应该已经没有什么意义,即使是编码器,但对于教育的目的,在这里是如何使用补种的IDENTITY ADO:

ACC2000: Cannot Change Default Seed and Increment Value in UI

注该文章过时了,因为它说,“用户界面(UI)中没有可供您进行此更改的选项。”在后来的Access版本中,可以在ANSI-92 Query Mode是这样的:

ALTER TABLE MyTable ALTER TestID INTEGER IDENTITY (1, 1) NOT NULL;

+0

我很惊讶你不推荐ADO,因为它在“SQL 92”模式下执行,并且可用于所有Jet 4版本的Access。你知道我并不是ADO的朋友,但这是我真正使用它的地方(我上周写了代码来做这件事,因为我从一个存档中追加了一些旧数据,这些数据的自动编号值低于当前Max( )并且需要在追加后重置它)。 – 2009-12-19 04:22:25

+0

“我很惊讶你不会推荐ADO” - OP似乎在使用.NET,所以我不会推荐ADO classic。他们可能会使用OLE DB,即ANSI-92查询模式。注意(再次!)它是ANSI-92查询模式而不是“SQL 92”。 – onedaywhen 2009-12-21 09:49:20

+0

注意到“ANSI-92”,但不是您必须传递与Access UI“SQL 92”模式中调用的内容兼容的Jet OLE-DB提供程序SQL,而不是严格的ANSI -92 SQL? – 2009-12-22 00:55:41