2014-05-06 30 views
2

我負責修復的數據庫具有帶有具有BigInt數據類型的標識列/ PK的表。這會導致Access前端出現問題,因爲該鏈接表的數據表不允許對記錄進行編輯。 (這是ODBC驅動程序和Access的已知問題)如何在不丟失數據的情況下更改我的表的標識列數據類型

表的Id列不應該是作爲bigint創建的,但現在是一個模擬點。我需要使用int數據類型轉換或重新創建此列,而不會丟失現有數據。

本表中有〜200萬條記錄。 存在未知數量的應用程序和Access應用程序訪問此表,因此我試圖儘可能平滑/儘可能隱蔽地執行此操作,因爲在進行更改之前查找所有這些應用程序並修改它們的可能性很小。

任何想法或想法?

+0

這在Sql Server中是相當直接的,不知道你必須做些什麼才能保持元數據在Access中同步。 – RBarryYoung

+0

我並不擔心Access元數據。我在SQL中嘗試的所有內容都告訴我必須刪除並重新創建表 –

+0

您可以這樣做,但這可以在不丟失任何數據的情況下完成。從GUI(管理工作室)很容易。如果你需要一個SQL腳本,那麼最簡單的方法就是讓GUI爲你做。 – RBarryYoung

回答

3

以下是如何從管理Studio(SSMS)做到這一點:

  1. 首先,讓你的數據庫的備份副本。如果你犯了一個錯誤,或者發生了意想不到的事情,修復它的最簡單方法就是從備份中恢復。

  2. 在SSMS資源管理器窗格中,導航到表格,然後右鍵單擊它並單擊「設計」。

  3. 選擇Identity列的行並將其數據類型更改爲「INT」。

  4. 保存您的更改,忽略警告。

如果你需要一個腳本來代替,然後更換步驟(4)以上:

  • 點擊腳本更改按鈕。忽略警告,然後將腳本複製到您的粘貼緩衝區中。創建一個新的查詢窗口並將腳本粘貼到其中。然後關閉設計窗口,取消任何更改。

由於斯圖爾特安斯沃思指出,在SQL Server的更高版本,它可以阻止你這樣做,有一個關於「刪除表」的警告。要在SSMS中修復此問題,請單擊Tools..Options菜單項,然後轉到「Designers」下的「Tables and Designers」窗格並取消選中「保存需要表格重新創建的更改」選項。

+0

這假定了一些事情; 1:SSMS必須配置爲允許進行更改以刪除數據(這是一個新選項),2:您有足夠的時間和空間將200萬行數據移動到臨時表中。 –

+0

200萬?這就像問「你需要一個5美元鈔票的存儲空間」。 200萬行可以存儲在任何硬手機上,除非這是一個圖像大量的列。 – TomTom

+0

@StuartAinsworth自SQL Server 2005以來,這個特定的過程對我來說很有用。AFAIK,「允許刪除」選項實際上用作默認行爲,並且只有在它們使其可配置後,才進行默認更改以禁止它。 – RBarryYoung

3

我假設IDENTITY列是您的PRIMARY KEY,它可能是集羣:)我的建議下面是基於這些假設。

如果你只得到了放在桌子上的幾個指標,和主鍵是隻有少數的外鍵引用,你應該能夠通過改變數據類型:

  1. 刪除任何非聚簇索引其中包含IDENTITY值。
  2. 刪除指向PRIMARY KEY的FOREIGN KEY約束。
  3. 掉落的PRIMARY KEY
  4. ALTER TABLE tablename ALTER COLUMN columnname INT;
  5. 重新創建PRIMARY KEY
  6. 重新啓用外鍵與CHECK約束。
  7. 重新創建您的非聚集索引。

正如RBarryYoung指出的,很多這些可以由SSMS GUI(如果它被配置爲允許保存更改)腳本化,但不同之處在於GUI將創建臨時表,移動數據,將新表重命名爲舊名稱,然後刪除原始表。

+0

我在過去比較了這兩種方法,並且(令人驚訝地)在性能上沒有發現太大差異。很明顯,ALTER TABLE..ALTER COLUMN...命令對引擎蓋下的表格進行了大量重新構建(至少在其集羣密鑰是我實際測試的唯一案例時)。 – RBarryYoung

相關問題