2010-01-12 74 views
2

我需要能夠更改表中的主鍵。問題是,一些鍵將改變爲現有的鍵值。例如。 record1.ID 3 => 4和record2.ID 4 => 5。我需要保持這些作爲主鍵,因爲它們被設置爲外鍵(級聯更新)是否有合理的方法來實現這一點,或者我嘗試sql這裏?SQL - SQLDataAdapter更新導致主鍵違規

至於爲什麼,我有一組通過這個主鍵鏈接的表格中的數據被插入/更新到另一組類似結構的表格中。插入是分成幾部分的,因爲它是重複數據刪除過程的一部分,如果我可以簡單地更新所有要使用新主鍵插入的表格,生活會更容易。

一個解決方案是啓動目標表上的索引高於傳入錶行數將會達到的程度(每次傳入的表都會重新索引),但是我仍然想知道是否可以做到以上,否則。

TIA

+0

因此,如果現有記錄的主鍵已更改,並且其他表上的相關外鍵,但** new **記錄絕對必須具有與其他數據庫中的鍵相同的鍵才行。是嗎?因爲,如果你只是給插入記錄添加新密鑰,並且在其他表上添加所有**相關記錄,那將是非常好的。這會讓這很容易。 – 2010-01-12 21:41:20

回答

1

您正在嘗試SQL異端。我其實很開明,知道很多時候我們必須做一些看起來很瘋狂的事情。當人們傲慢地回答「你應該以不同的方式做出回答」,當他們知道情況是什麼的時候,它會讓我很煩惱。不過,我必須告訴你,你應該這樣做。嘿嘿。

不,沒有辦法用sql \ DataAdapter來優雅地做到這一點。你可以用這個通過ADO.NET做一系列的t-sql命令。您必須每次打開身份覆蓋模式(set identity_insert theTable on),進行查詢,其中該表上的所有值都遞增1,然後轉爲自動編號覆蓋模式。但是,然後你需要增加所有其他使用這個作爲外鍵的表。別急,還有更糟糕的:

  • 您將需要這一切在交易,因爲你不能有任何其他在此期間,發生在這些表,因爲如果有一個失敗,你都肯定需要回滾。這可能是一大塊大小的處理;你的表格會被鎖定好一點。
  • 如果您在這些表之間有任何外鍵約束,您需要先關閉它們,然後再重新執行它們。
+0

給出的例子是爲了清晰。他們正在根據唯一列映射到決賽桌中的不同ID。我需要使用正確的外鍵將映射移動到它們各自的最終表中。 在插入/更新它們到最終表中之前,我可以更新每個表中每行的外鍵,它看起來像我可以在這裏作弊一點。 – Brian 2010-01-12 22:01:44

+0

啊,好的。因此,如果現有表格的關鍵字是45,987,並且數字是否可以將您的20,000條記錄添加到50,001到70,000?如果身份領域存在差距,那很好。 (或者,如果不是,你只需要在最後一刻更新映射表並停止正常進程的新插入。)這似乎是對我來說最直接的方式,但我猜測我錯過了一些東西。我錯過了什麼? – 2010-01-12 22:11:23

+0

對於新實體,這可以工作,但其中一些實體與現有記錄相對應,並且只有它們的關聯表可能需要更新或插入數據。提到源表和目標表集都是星形模式可能很有幫助,中心表由id和幾個唯一標識的列組成。 – Brian 2010-01-13 16:29:30

0

如果您發現自己開始考慮更新主鍵值,則警鈴應該開始振鈴。 看起來似乎更容易,但我認爲它更像是一種解決方案。就個人而言,我會重新思考並嘗試解決真正的問題 - 現在可能看起來更難,但維護和減少潛在的可怕問題要好得多。

+0

主鍵將改變的表格是工作表。經過大量處理後,它們的行被插入(或更新)到實際的表中。實際表中的行必須有不同的主鍵。更新中央臨時表中的主鍵似乎是一種簡單的方法,可以將由中央表的主鍵鏈接的所有臨時表保持在一起,直到其數據插入到最終表中。它似乎不再那麼多了。 – Brian 2010-01-12 21:55:11