现在我们已经用完了 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/