2015-04-30 66 views
0

是否有一種簡單的方法(使用SQL查詢或帶有DAO記錄集的VBA)在索引字段中交換兩個值?在我的情況下,該字段是小表的主鍵(預計不會超過30條記錄)。預期的輸入和輸出如下。在索引字段中交換兩個值

前:

StageNumber | Description 
------------+-------------------------- 
    01   | First Thing 
    02   | Second Thing 

後:

StageNumber | Description 
------------+-------------------------- 
    02   | First Thing 
    01   | Second Thing 

我知道這看起來像我可以簡單地切換的描述,而不是StageNumber但StageNumber用作外鍵放入另一個表中,並在關係中指定級聯更新,因此,簡單地切換描述會導致「子」記錄與錯誤的「父」關聯。

理想情況下,這將通過單個UPDATE..SET查詢來實現,但對於我的生活,我無法弄清楚這種操作的語法是什麼,而不會導致主鍵違例錯誤。

+2

您可以刪除約束,更新它,然後重新創建約束。你嘗試過嗎? –

+0

通過切換它們,是不是破壞了子記錄已經鏈接到的父數據?你說切換它們會糾正一切,但是對你目前的數據有什麼影響? –

+0

@ Invent-Animate如果我更改此表中的索引值,級聯更新應更新相應子記錄中的外鍵,從而正確保留父子關係。 – Aiken

回答

1

這強調了使用自然鍵作爲主鍵的危險之一,當存在身份變化的風險時。

假設有可能會在未來發生類似的變化,另一種是一個新的代理PK添加到Stage表(例如ID作爲整數AUTONUMBER),然後輸入:

  • 添加新StageId外鍵列到引用Stage的所有表格。
  • 然後更新StageId列通過查找指定正確的StageId通過現有的外鍵(StageNo
  • 然後刪除FOREIGN KEY約束對現有StageNumber外鍵列引用表中加入。
  • Stage.StageNumberPRIMARY KEY,改變PK到Stage.Id
  • 然後引用表中的新StageId外鍵列重新添加FOREIGN KEY約束。

您現在可以自由更改StageNumber列的值,因爲它不再是外鍵的一部分。

+0

即使StageNumber不是主鍵我希望它沒有重複索引,所以不會遇到相同的問題? – Aiken

+0

是的,您仍然可以在「StageNumber」上創建一個[唯一約束](https://msdn.microsoft.com/en-us/library/bb177889(v = office.12).aspx)鍵 – StuartLC

+0

好吧,讓我們暫時忘記我的領域是主鍵,我可能已經用這些信息將人們拖到了完全錯誤的軌道上。假設StageNumber是一個整數類型的索引字段,不允許重複,我如何交換兩條記錄的StageNumbers而不會導致索引違規?我知道使用一個有意義的主鍵可能是錯誤的,但是你的回答並沒有清楚地說明如何簡單地使用索引字段來讓我輕鬆執行「交換值」操作。 – Aiken

0

將第一條記錄的StageNumber更新爲未使用的任意數字。

更新第一條記錄具有的第二條記錄的StageNumber。

更新第二條記錄具有的第一條記錄的StageNumber。

或者,在兩個步驟:

更新都StageNumbers任意號碼不在使用中。

將兩個StageNumbers都更新爲其他記錄具有的值。