sql-server - 更改大表PK列数据类型

标签 sql-server alter-table

现在我们已经用完了 PK 列(这是一个 IDENTITY)的 int 容量,我想对 bigint< 执行此操作,但是简单的ALTER TABLE似乎无法处理那么大的表。所以我的问题是:如何更改 PK 列的类型并保持实际值不变,我是否还需要更改引用表?

最佳答案

除了 KLE 的建议之外,以下查询可能会有所帮助:

要禁用引用 oldTable 的表上的所有约束,请尝试执行以下查询的输出:

SELECT 'ALTER TABLE ' + OBJECT_NAME(fk.parent_object_id) + ' NOCHECK CONSTRAINT ' + fk.name
FROM sys.foreign_keys fk
INNER JOIN sys.foreign_key_columns AS fkc ON fk.OBJECT_ID = fkc.constraint_object_id
WHERE OBJECT_NAME (fk.referenced_object_id) = 'oldTable'

要将所有数据移动到新表中,并更改字段,请尝试以下操作:

INSERT INTO newTable
SELECT CONVERT(BIGINT, ID) AS ID, COL1, COL2, ..., COLN
FROM oldTable

删除旧表:

DROP TABLE oldTable

要将新表重命名为旧名称:

sp_rename newTable, oldTable

要重新启用引用 oldTable 的表上的所有约束,请尝试执行以下查询的输出:

SELECT 'ALTER TABLE ' + OBJECT_NAME(fk.parent_object_id) + ' CHECK CONSTRAINT ' + fk.name
FROM sys.foreign_keys fk
INNER JOIN sys.foreign_key_columns AS fkc ON fk.OBJECT_ID = fkc.constraint_object_id
WHERE OBJECT_NAME (fk.referenced_object_id) = 'oldTable'

希望对你有帮助...

关于sql-server - 更改大表PK列数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1420176/

相关文章:

mysql - ALTER TABLE lhm 迁移删除现有值

oracle - 在 Oracle 中的关键字后更改表

sql - 从 Postgres 的外键约束中删除 `MATCH FULL` 的理想方法是什么?

sql-server - 在不指定实例的情况下连接到多实例 SQL Server

sql-server - 使用 SQL Server 输出编码为 UTF-8 的 XML 文件

Sql Server 2005 - 插入更新触发器 - 获取更新,插入行

mysql - 如何更改超过 1 列的表列数据类型?

mysql - mySQL 的外键

c# - 将数据库附加到exe的可能方法

mysql - 从 SQL Server 迁移到 AWS Aurora