2009-12-17 78 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

相關問題