如何在不丢失数据的情况下更改SQL数据库中的列数据类型


198

我有SQL Server数据库,我刚刚意识到可以将其中一列的类型从int更改为bool

如何做到这一点而又不会丢失已经输入到该表中的数据?


3
您是否尝试过创建新的bit列,将旧列中的值复制到新列中,删除旧列并重命名新列?当然,所有这一切都可以在事务中回滚。
Radu Caprescu 2011年

2
您说“我刚刚意识到可以将类型从int更改为bool”,没有布尔数据类型。虽然有一点。你问如何,你可以做到这一点(如2个答案至今已覆盖)。还是您的问题“我刚刚意识到这是可能的-SQL Server如何做到这一点?”
马丁·史密斯

Answers:


329

您可以使用以下命令轻松执行此操作。任何值0都将变为0(BIT = false),其他任何值都将变为1(BIT = true)。

ALTER TABLE dbo.YourTable
   ALTER COLUMN YourColumnName BIT

另一种选择是创建一个新类型BIT的列,从旧列中填充它,完成后,放下旧列并将新列重命名为旧名称。这样,如果转换过程中出现问题,您仍然可以返回,因为您仍然拥有所有数据。


10
换句话说:NULL遗迹NULL0成为False非零值(1,-1,1999,-987 ...)成为True
阿尔瓦罗·冈萨雷斯

2
永远不要从GUI进行这样的更改。始终通过这样的脚本来实现它。GUI将删除并重新创建表,这将花费大量时间。如果桌子很大并且在生产中,这可能是灾难性的。另外,所有表更改均应具有与所有其他代码一样在源代码管理中的脚本。
HLGEM

1
我要补充的是,在对包含数据的表进行任何结构更改之前,请确保您具有数据库的当前备份。如果该表经常使用或很大,则不要在高峰使用时间内对生产进行此类更改。
HLGEM

我错误地批准了这些修改...需要拒绝..因为那里没有任何改进... Ans是完美的。
维卡什·帕塔克

22
ALTER TABLE tablename
ALTER COLUMN columnname columndatatype(size)

注意:如果有列大小,则也要写大小。


20

如果是有效的更改。

您可以更改属性。

工具->选项->设计器->表和数据库设计器->取消选中->防止保存需要重新创建表的更改。

现在,您可以轻松更改列名,而无需重新创建表或丢失您的记录。


5
在任何情况下都不应使用GUI更改表。它将完全重新创建该表,而不是使用Alter表,并且如果您取消选中该表且该表很大,则会导致问题。此外,您应该在源代码管理的脚本中对表进行所有更改。
HLGEM

仔细研究该选项-它关闭了一项安全功能,该功能可防止GUI掉落桌子。您似乎不会丢失数据,因为GUI将重新创建表,但是在服务器上它将被复制/删除。因此,如果表中有很多数据,将导致非常大的操作。另外,我认为(不是肯定的)它发生在单个事务中,因此您可以填写事务日志。
JMarsch '17

1
我想我想在之前的评论中添加一些澄清。如果您只是在开发计算机上执行此操作,则可能很好。但是我不建议在生产数据库中使用这种方法-尤其是在任务关键型数据库中。
JMarsch

8

为什么您会丢失数据?只需进入Management Studio并更改数据类型。如果现有值可以转换为bool(位),它将执行此操作。换句话说,如果您在原始字段中将“ 1”映射为true,将“ 0”映射为false,则可以。


1
如果表中有数据,将无法使用。当您尝试更改列类型时,SMS声称它需要首先删除该表...这当然是不正确的,因为ALTER TABLE ... ALTER COLUMN命令即使对于非NULL字段也可以正常工作。这就是为什么他们认为自己可能会丢失数据。
Tony O'Hagan 2015年

1
@ TonyO'Hagan不对。您可以关闭警告,它将与现有数据一起正常工作。另请参见stackoverflow.com/questions/2947865/...
菲利普Leybaert

1
嗯不错!不知道 只是想对您投票(返回),但是除非您编辑答案,否则SO会阻止我。也许是微小的改变,我可以做到;)。
Tony O'Hagan 2015年

1
在任何情况下都不应使用GUI更改表。它将完全重新创建该表,而不是使用Alter表,并且如果您取消选中该表且该表很大,则会导致问题。此外,您应该在源代码管理的脚本中对表进行所有更改。
HLGEM

在任何情况下,都没有理由使用GUI设计表或更改表,也没有理由不这样做。所有更改都必须包含在脚本中,以便能够传播到其他服务器,并像它们实际在源代码控件中的代码一样对待。
HLGEM

5

如果您使用T-SQL(MSSQL); 您应该尝试以下脚本:

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

如果您使用MySQL;您应该尝试以下脚本:

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

如果您使用Oracle;您应该尝试以下脚本:

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

3

转到“工具-选项-设计器-表和数据库设计器”,然后取消选中“阻止保存”选项在此处输入图片说明


1
在任何情况下都不应使用GUI更改表。它将完全重新创建该表,而不是使用Alter表,并且如果您取消选中该表且该表很大,则会导致问题。此外,您应该在源代码管理的脚本中对表进行所有更改。
HLGEM

2

用column的check type更改column的数据类型:

IF EXISTS(
       SELECT 1
       FROM   sys.columns
       WHERE  NAME = 'YourColumnName'
              AND [object_id] = OBJECT_ID('dbo.YourTable')
              AND TYPE_NAME(system_type_id) = 'int'
   )
    ALTER TABLE dbo.YourTable ALTER COLUMN YourColumnName BIT

1

对我来说,在sql server 2016中,我这样做

*要将列Column1重命名为column2

EXEC sp_rename 'dbo.T_Table1.Column1', 'Column2', 'COLUMN'

*要将列类型从字符串修改为int :( 请确保数据格式正确

ALTER TABLE dbo.T_Table1 ALTER COLUMN Column2  int; 

0

在精简版中,日期时间数据类型(即(8))将自动采用大​​小,因此无需设置字段大小并为此操作生成错误...


-2

我可以使用以下查询来修改表字段的数据类型:以及在Oracle DB中,

ALTER TABLE table_name
MODIFY column_name datatype;

不在SQl Server中
HLGEM

-4

替换数据类型而不会丢失数据

alter table tablename modify columnn  newdatatype(size);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.