【问题标题】:Change column type from bigint to numeric(18,0) in sql server在 sql server 中将列类型从 bigint 更改为 numeric(18,0)
【发布时间】:2015-05-19 10:05:35
【问题描述】:

我有大约 10 个表,其中包含数据。我需要将数据类型为 bigint 的字段更改为 numeric(18,0)。

我们已验证数据库中的数据,不会有任何数据丢失。在我们较低的环境中,我们所做的是:

  1. 为现有表备份,暂时重命名
  2. 创建一个数值数据类型的新表
  3. 从备份表中填充数据
  4. 如果一切正常,则删除备份表

以上是我们在lower环境中遵循的流程。

但是,当涉及到 prod 时,我们不能遵循上述程序。我们想使用 ALTER 语句进行更改。由于是 PROD 环境,我们必须小心更改。正如我之前所说,不会有任何数据丢失。

但仍然想知道 - 当我们执行 ALTER 语句时内部会发生什么?

它会删除表并使用新定义重新创建它并重新填充数据吗?如果是这样,是否存在与此相关的风险?

任何关于如何在 PROD 中正确处理此问题的想法将不胜感激。

【问题讨论】:

  • 但是为什么要从 bigint 到 numeric(18,0)?我会反其道而行之……
  • 我正在使用 MS Access 链接表进行映射。 Bigint 将在 Access 中转换为文本而不是数字,而 SQL 服务器中的数字将正确映射为数字
  • 如果您使用查询更改表,那么在内部它不会删除并重新创建表。不要使用 SSMS。
  • 唯一的风险是这将导致的临时中断......您还想到了哪些其他风险? SQL Server 不允许发生损坏。
  • 您不需要该问题的答案。您需要在暂存环境中对此进行测试并测量需要多长时间以及需要多少 tlog。无论您的问题的答案如何。

标签: sql sql-server-2008 alter


【解决方案1】:

我可能会建议一种不重建数据的方法。请改用计算列。像这样的:

sp_rename 'table.dbo.col', '_col', 'COLUMN';

alter table table add col as (cast(_col as numeric(18, 0));

然后您可以访问col 作为您想要的类型。您不必重写任何数据,因此不会出现任何锁定或其他性能问题。当然,select * 会有点多余,但你可能不应该这样做。

【讨论】:

  • 我会选择添加的计算列,而不是重命名列,否则您将影响所有现有的读取、插入和更新
猜你喜欢
  • 2017-09-07
  • 2011-10-13
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 2016-02-03
  • 2012-05-11
  • 2021-03-04
  • 1970-01-01
相关资源
最近更新 更多