【问题标题】:Changing columns from INT to BIGINT in different tables将不同表中的列从 INT 更改为 BIGINT
【发布时间】:2017-04-16 09:14:35
【问题描述】:

我遇到需要将不同表中的列从 INT 更改为 BIGINT 的情况。问题是其中一些表中有约束、索引、键和数据;其中一些是相互关联的。 我创建了一系列步骤来完成这项工作,我会感谢您的意见。

  1. 标识表中的列。 SELECT SCHEMA_NAME(schema_id) AS schema_name, t.name AS table_name, c.name AS column_name FROM sys.tables AS t INNER JOIN sys.columns c ON t.OBJECT_ID = c.OBJECT_ID WHERE 1=1 AND c.name LIKE '% columnname%' ORDER BY schema_name, table_name;

  2. 选择一个表并生成脚本以创建和删除每个约束、键和索引。

  3. 创建一个与选取的表具有相同结构的新表,但将所需列创建为 BIGINT 而不是 INT。

  4. 将旧表中的行插入到新表中。

  5. 为旧表中的每个约束、键和索引运行 DROP 脚本。

  6. 删除旧表中的所有行。

  7. 更改旧表以将所需列从 INT 修改为 BIGINT。

  8. 为旧表中的每个约束、键和索引运行 CREATE 脚本。

  9. 将新表中的行插入到旧表中。

  10. 转到第 2 步,选择另一个表并重复。

您认为这是一个好计划吗?我也感谢任何有关备份计划的建议。

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    为什么不直接改变你的列数据类型呢?转换INT -> BIGINT应该没问题

    ALTER TABLE dbo.yourTable
       ALTER COLUMN yourColumnName BIGINT
    

    【讨论】:

    • 表中有一些约束、数据和索引,我不能简单地改变数据类型。
    • 什么限制导致你出现问题?外键并不介意是 INT 还是 BIGINT。索引也不应该是一个问题,索引只会被重建。
    • 真的吗?那么现有的数据呢,这不是进行更改的问题吗?
    • 我不认为你有任何问题,但一如既往地在测试之前备份你的数据。在此处检查数据类型 msdn.microsoft.com/en-us/library/ms187745.aspx INT 是 4 个字节,BIGINT 是 8 个字节,您可以将任何 INT 放入 BIGINT 没有问题。就像您尝试将 1 升瓶子的内容物放入 2 升瓶子中。如果您尝试朝另一个方向发展,就会出现问题
    • 我刚刚在另一个数据库中进行了测试,在执行 ALTER TABLE 查询以修改数据类型后,我遇到了一些错误: - 对象 'PK_pkname' 依赖于列 'columnname'。 - 索引“IX_ixname”取决于列“columnname”。 - ALTER TABLE ALTER COLUMN TableName 失败,因为一个或多个对象访问此列。
    猜你喜欢
    • 1970-01-01
    • 2016-02-03
    • 1970-01-01
    • 2013-09-24
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 1970-01-01
    • 2012-02-19
    相关资源
    最近更新 更多