2011-02-27 66 views
146

我有SQL Server數據庫,我剛剛意識到我可以將其中一列的類型從int更改爲bool如何在不丟失數據的情況下更改SQL數據庫中的列數據類型

我該如何做,而不會丟失已經輸入到該表中的數據?

+3

你是否嘗試過創建一個新的位列,將舊列的值複製到新列中,刪除舊列並重命名新列?所有這些在交易中,當然是回滾問題。 –

+2

你說:「我只是意識到,我可以改變從int到bool列之一的類型」沒有布爾數據類型。雖然有一點。你問你**如何做到這一點(因爲迄今爲止的2個答案已經涵蓋)。或者是你的問題「我剛剛意識到這是可能的 - ** SQL Server **如何做到這一點?」 –

+1

可能的重複[如何更改MS SQL中列的數據類型?](http://stackoverflow.com/questions/626899/how-do-you-change-the-datatype-of-a-column- in-ms-sql) – nandeesh

回答

249

您可以使用以下命令輕鬆完成此操作。任何0值都會變成0(BIT = false),其他任何值都會變成1(BIT = true)。

ALTER TABLE dbo.YourTable 
    ALTER COLUMN YourColumnName BIT 

另一種選擇是創建BIT類型的新列中,從舊列填充它,而一旦大功告成,刪除舊列,並重新命名新一箇舊名稱。這樣,如果轉換過程中出現問題,您可以隨時返回,因爲您仍然擁有所有數據。

+9

換句話說:NULL值保持爲NULL,0值變爲False,非零值(1,-1,1999,-987 ...)變爲「True」。 –

+1

永遠不要在GUI中做這樣的改變。總是通過這樣的腳本來完成。 GUI將會丟棄並重新創建表格,這會花費更多時間。如果桌子很大並且在生產上,這可能是災難性的。另外,所有表格更改都應該有一個像所有其他代碼一樣在源代碼控制中的腳本。 – HLGEM

+1

我想補充一點,在對數據表進行任何結構性更改之前,請確保您有數據庫的當前備份。如果表經常使用或大量使用,在高峯使用時間內不要在生產環境中執行此類更改。 – HLGEM

6

爲什麼你認爲你會丟失數據?只需進入Management Studio並更改數據類型即可。如果現有的值可以轉換爲布爾(位),它會這樣做。換句話說,如果「1」映射爲true,並且「0」在原始字段中映射爲false,那麼您將會很好。

+0

如果你有表中的數據,這將無法正常工作。當您嘗試更改列類型時,SMS聲稱它需要首先刪除表......這當然是不正確的,因爲即使對於非NULL字段,ALTER TABLE ... ALTER COLUMN命令也可以正常工作。這就是爲什麼他們認爲他們可能會丟失數據。 –

+1

@ TonyO'Hagan事實並非如此。您可以關閉該警告,並且它可以在現有數據下正常工作。另見http://stackoverflow.com/questions/2947865/sql-server-2008-management-studio-drop-tables-warning –

+1

好酷!不知道。只是試圖投票給你(後退),但是,除非你編輯你的答案,否則是阻止我。也許是一個小小的改變,我可以這樣做;)。 –

7
ALTER TABLE tablename 
ALTER COLUMN coulumnname columndatatype(size) 

注意:如果有大小的列,只需寫入大小即可。

0

在緊湊版將自動採取大小日期時間數據類型,即(8),所以沒有必要設置字段的大小和用於該操作產生錯誤...

12

如果它是一個有效的變化。

您可以更改屬性。

工具 - >選項 - >設計人員 - >表和數據庫設計人員 - >取消選中 - >禁止保存需要重新創建表的更改。

現在,您可以輕鬆地更改列名稱而無需重新創建表或丟失您的記錄。

+1

在任何情況下,您都不應該使用GUI進行表格更改。它將完全重新創建表格而不是使用Alter表格,如果您取消選中並且表格很大,則會導致問題。此外,您應該對源代碼管理腳本中的表進行所有更改。 – HLGEM

+0

仔細查看該選項 - 它會關閉一項安全措施,防止GUI丟棄表格。您將不會丟失數據,因爲GUI將重新創建表,但在服務器上它將被複制/放置。所以,如果表中有很多數據,它將導致一個非常大的操作。另外,我_think_(不肯定)它發生在單個事務中,因此您可以填寫您的事務日誌。 – JMarsch

+0

我想我想對我以前的評論添加一點澄清。如果你只是在你的開發機器上做這個,你可能沒問題。但我不會建議在生產數據庫上使用這種方法 - 特別是如果它是關鍵任務的話。 – JMarsch

-3

更換數據類型而不會丟失數據

alter table tablename modify columnn newdatatype(size); 
2

轉到工具 - 選項 - 設計師 - 表和數據庫設計,並取消禁止保存選項enter image description here

+0

在任何情況下,您都不應該使用GUI進行表格更改。它將完全重新創建表格而不是使用Alter表格,如果您取消選中並且表格很大,則會導致問題。此外,您應該對源代碼管理腳本中的表進行所有更改。 – HLGEM

-2

我可以修改表中字段的數據類型,這些下面的查詢:並在Oracle數據庫,

ALTER TABLE table_name 
MODIFY column_name datatype; 
+0

不在SQl服務器中 – HLGEM

2

如果使用T-SQL(MSSQL);你應該試試這個腳本:

ALTER TABLE [Employee] ALTER COLUMN [Salary] NUMERIC(22,5) 

如果你使用MySQL;你應該試試這個腳本:

ALTER TABLE [Employee] MODIFY COLUMN [Salary] NUMERIC(22,5) 

如果你使用Oracle;你應該試試這個腳本:

相關問題