如何在不丢失数据的情况下更改表的标识列数据类型

时间:2014-05-06 17:27:04

标签: sql sql-server tsql ms-access

我负责修复的数据库有一个带有标识列/ PK的表,其数据类型为BigInt。这会导致Access前端出现问题,因为此链接表的数据表不允许对记录进行编辑。 (这是ODBC驱动程序和Access的已知问题)

表格的Id列首先应该永远不会被创建为bigint,但现在这是一个没有实际意义的点。我需要使用int数据类型转换或重新创建此列,而不会丢失现有数据。

此表中有大约200万条记录。 有一个未知数量的应用程序和访问应用程序访问此表,所以我试图尽可能顺利/悄悄地执行此操作,因为在我进行更改之前找到所有这些应用程序并修改它们的可能性很小。

有什么想法或想法吗?

2 个答案:

答案 0 :(得分:3)

以下是如何从Management Studio(SSMS)执行此操作:

  1. 首先,制作数据库的备份副本。如果您犯了错误或发生了意外情况,最简单的解决方法就是从备份中恢复。

  2. 在SSMS Explorer窗格中,导航到该表,然后右键单击它并单击" Design"。

  3. 选择标识栏的行并将其数据类型更改为" INT"。

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

  5. 如果您需要脚本,请将上面的步骤(4)替换为:

    • 单击“脚本更改”按钮。忽略警告,然后将脚本复制到粘贴缓冲区。创建一个新的查询窗口并将脚本粘贴到其中。然后关闭设计窗口,取消任何更改。

    正如Stuart Ainsworth所指出的那样,在SQL Server的更高版本中,它可能会阻止您这样做,并警告"删除表"。要在SSMS中修复此问题,请单击Tools..Options菜单条目,然后转到" Tables and Designers"设计师"设计师"并取消选中"防止保存需要表重新创建的更改"选项。

答案 1 :(得分:3)

我假设IDENTITY列是你的PRIMARY KEY,它可能是聚集的:)我的建议是基于这些假设。

如果您在表上只有几个索引,并且PRIMARY KEY仅由少量FOREIGN键引用,那么您应该能够通过以下方式更改数据类型:

  1. 删除包含IDENTITY值的任何非聚簇索引。
  2. 删除指向PRIMARY KEY的FOREIGN KEY约束。
  3. 放弃PRIMARY KEY
  4. ALTER TABLE tablename ALTER COLUMN columnname INT;
  5. 重新制作PRIMARY KEY
  6. 使用CHECK重新启用FOREIGN KEY约束。
  7. 重新创建非聚簇索引。
  8. 正如RBarryYoung指出的那样,SSMS GUI可以编写很多这样的脚本(如果它被配置为允许保存更改),但区别在于GUI将创建一个临时表,移动数据,将新表重命名为旧名称,然后删除原始名称。