2011-02-27 67 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;你应该试试这个脚本:

相关问题